Куда мне поместить "вспомогательные" методы?
-
03-07-2019 - |
Вопрос
В моем приложении Ruby on Rails у меня есть:
class AdminController < ApplicationController
def create
if request.post? and params[:role_data]
parse_role_data(params[:role_data])
end
end
end
а также
module AdminHelper
def parse_role_data(roledata)
...
end
end
Тем не менее, я получаю сообщение об ошибке со словами parse_role_data
не определено.Что я делаю не так?
Решение
Помощники в основном используются для сложных задач, связанных с выводом, таких как создание HTML-таблицы для календаря из списка дат.Все, что связано с бизнес-правилами, такими как синтаксический анализ файла, должно быть включено в соответствующую модель, возможный пример ниже:
class Admin < ActiveRecord::Base
def self.parse_role_data(roledata)
...
end
end
#Call in your controller like this
Admin.parse_role_data(roledata)
Также рассмотрите возможность использования (RESTful routes или опция:conditions)[http://api.rubyonrails.org/classes/ActionController/Routing.html ] при составлении маршрутов, вместо проверки наличия request.post?
в вашем контроллере.
Другие советы
Разве вы не должны обращаться к parse_role_data через AdminHelper?
Обновление 1: проверьте это http://www.johnyerhot.com/2008/01/10/rails-using-helpers-in-you-controller/
Судя по тому, пытаетесь ли вы создать пользовательский интерфейс для добавления ролей пользователям.Я собираюсь предположить, что у вас уже есть UsersController, поэтому я бы предложил добавить Role model и RolesController.В вашем routes.rb вы бы сделали что-то вроде:
map.resources :users do |u|
u.resources :roles
end
Это позволит вам иметь такой маршрут, как:
/users/3/roles
В вашем RolesController вы бы сделали что-то вроде:
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
Это возьмет данные параметров роли из формы, отображаемой в новом действии, и создаст новую ролевую модель для этого пользователя.Надеюсь, это хорошая отправная точка для вас.