Pular para o conteúdo principal

Sobrescrevendo o controlador

Embora o Nerdify implemente toda a lógica padrão de CRUD, filtros, paginação, autorização e montagem dos templates, há situações em que é necessário sobrescrever comportamentos específicos do controlador.

A seguir estão exemplos de como fazer isso da forma mais recomendada: usando super para reaproveitar a lógica padrão e estender/modificar apenas o necessário.


🔁 Sobrescrevendo object

Use quando você quer adicionar comportamentos adicionais no momento de criar ou buscar um objeto (em new, show, edit, etc):

def object
if action_name == "create"
super.tap do |obj|
obj.code ||= SecureRandom.hex(4)
end
else
super
end
end

🔁 Sobrescrevendo objects

Use quando quiser modificar a coleção de dados retornados no index, como adicionar joins, filtros especiais ou escopos:

def objects
super.includes(:category).where(active: true)
end

🧠 Sobrescrevendo criteria

Permite modificar os filtros aplicados via params[:filters] antes de gerar a query:

def criteria
super.merge(status: 'approved')
end

O criteria sempre deve retornar um hash com os filtros a serem aplicados.


✅ Sobrescrevendo object_parameters

Use quando precisar modificar ou acrescentar parâmetros permitidos (strong params):

def object_parameters
params.require(:invoice).permit(:name, :total, :due_date)
end

Esse método deve sempre retornar um objeto compatível com os métodos de criação e atualização do Rails (.new, .update, .update_attributes).


🧾 Sobrescrevendo page_json

Quando quiser incluir mais dados na resposta da página:

def page_json
super.merge(extra_info: { current_time: Time.current })
end

Ideal para incluir metadados ou configurações específicas para o frontend.


🔄 Sobrescrevendo actions do CRUD

Você pode sobrescrever qualquer action (create, update, destroy, etc) normalmente:

def create
authorize! :create, model

if object.save
after_create_hook(object)
render json: { redirect_to: router_path(object) }
else
render json: { errors: object.errors }, status: :unprocessable_entity
end
end

🧬 Boas práticas

  • Sempre que possível, chame super e apenas complemente ou altere a resposta.
  • Utilize os métodos object e objects em vez de chamar Model.find diretamente.
  • Utilize page_json para enriquecer a resposta da página sem alterar o comportamento padrão.
  • Prefira sobrescrever os métodos auxiliares (object, objects, criteria, page_json, etc.) em vez das actions diretamente.
  • Ao sobrescrever actions diretamente, não esqueça de chamar authorize! com o modelo e a ação correspondente, para manter a consistência com o sistema de permissões do Nerdify.

Essas abordagens permitem estender a funcionalidade do Nerdify mantendo a base automatizada e reutilizável intacta. Em geral, quanto menos código no controlador, melhor — se precisar escrever demais, provavelmente a lógica pode ser modelada de outra forma ou o template precisa ser reorganizado.