Синтаксис Rails Передача параметров POST из формы в контроллер - PullRequest
1 голос
/ 19 декабря 2011

Я новичок в Rails (и довольно плохо знаком с программированием в целом), и я создаю веб-приложение для себя, как способ обучения. Прямо сейчас я изменяю формы лесов и тому подобное.

Мой вопрос связан с методом create в одном из моих контроллеров. Есть две сущности, которые меня интересуют: таблица User и таблица Habit. Я создал раскрывающийся список в части _form для представлений Habit, чтобы позволить человеку выбрать пользователя из списка всех доступных при создании привычки, как показано ниже

<%= collection_select  :user, :id, @users, :id, :first_name %>

Контроллер привычки, конечно, имеет

def new
  @users = User.all
  ...    
end

Это прекрасно работает, и при отправке формы она отправляет два хэша параметров: привычка и: пользователь. Теперь, когда я хочу обработать ввод формы в методе create, я не уверен, как правильно использовать синтаксис и назначить user_id для вновь создаваемой привычки. То, что я хочу сделать, это что-то вроде

def create
   @habit = Habit.new(params[:habit], params[:user])
end

Это, конечно, неправильный синтаксис.

def create
   @habit = Habit.new(params[:habit])
end

правильно назначает параметры из хэша: привычки, но затем user_id остается неустановленным.

Работает следующее, но код очень длинный, присваивая каждое значение вручную.

def create
    @habit = Habit.new(:user_id => params[:user][:id], 
                   :description => params[:habit][:description], 
                   :habit_method => params[:habit][:habit_method], 
                  :time_reqd => params[:habit][:time_reqd],
                  :will_reqd => params[:habit][:will_reqd],
                  :active => params[:habit][:active])

end

Таким образом, мой вопрос: при работе с формой, которая публикует данные в нескольких хэшах, как правильно передать эти параметры в некоторый метод в контроллере?

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

Итак, мой вопрос в том, что при работе с формой, которая публикует данные в нескольких хэшах, как правильно передать эти параметры в какой-либо метод в контроллере?

Вместо того, чтобы говорить Habit.new( <lots of stuff> ), просто используйте Habit.new(params[:habit]). Rails попытается присвоить каждому ключу в хэше (в данном случае, ключам params[:habit] хеш) соответствующее значение на объекте.

Таким образом, если params [: привычка] имеет клавишу :description, она будет присвоена полю с именем description в вашей модели. Это называется массовое назначение и довольно удобно.

Теперь вы можете просто сделать:

@habit = Habit.new(params[:habit])
@habit.user_id = params[:user][:id]

Возможно, вы захотите прочитать Руководство по началу работы с RoR , например , в этом разделе , чтобы узнать больше о полезных функциях Rails.

0 голосов
/ 19 декабря 2011

Изменение

<%= collection_select  :user, :id, @users, :id, :first_name %>

Для

<%= collection_select  :habit, :user_id, @users, :id, :first_name %>

Существующий код скаффолда должен просто работать после этого

Alternate

<%= f.select :user_id, @users, :id, :first_name %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...