Onde coloco métodos 'auxiliares'?
-
03-07-2019 - |
Pergunta
No meu aplicativo Ruby on Rails, tenho:
class AdminController < ApplicationController
def create
if request.post? and params[:role_data]
parse_role_data(params[:role_data])
end
end
end
e também
module AdminHelper
def parse_role_data(roledata)
...
end
end
No entanto, recebo um erro dizendo parse_role_data
não está definido.O que estou fazendo de errado?
Solução
Os auxiliares são usados principalmente para tarefas complexas relacionadas a resultados, como criar uma tabela HTML para um calendário a partir de uma lista de datas.Qualquer coisa relacionada às regras de negócios, como a análise de um arquivo, deve ir no modelo associado, um possível exemplo abaixo:
class Admin < ActiveRecord::Base
def self.parse_role_data(roledata)
...
end
end
#Call in your controller like this
Admin.parse_role_data(roledata)
Também considere usar (rotas RESTful ou a opção :conditions)[http://api.rubyonrails.org/classes/ActionController/Routing.html] ao fazer rotas, em vez de verificar request.post?
em seu controlador.
Outras dicas
Você não deveria estar acessando o parse_role_data através do adminHelper?
Atualização 1: Verifique isso http://www.johnyerhot.com/2008/01/10/rails-using-helpers-in-you-centroller/
Pela aparência de se você está tentando criar uma interface do usuário para adicionar funções aos usuários. Vou assumir que você já possui um controlador de usuários, por isso sugiro adicionar um modelo e um riscontrolador. Em suas rotas.rb você faria algo como:
map.resources :users do |u|
u.resources :roles
end
Isso permitirá que você tenha uma rota como:
/users/3/roles
No seu Rolescontroller, você faria algo como:
def create
@user = User.find_by_username(params[:user_id])
@role = @user.roles.build(params[:role])
if @role.valid?
@role.save!
redirect_to @user
else
render :action => 'new'
end
end
Isso receberá os dados dos parâmetros da função do formulário exibido na nova ação e criará um novo modelo para esse usuário. Espero que este seja um bom ponto de partida para você.