我是Rails的新手(对于一般的编程来说还是新手),我正在为自己构建一个Web应用程序作为一种学习方式。现在我正在修改脚手架形式等。
我的问题是我的一个控制器中的“创建”方法。我关注的有两个实体:User表和Habit表。我在习惯视图的_form部分创建了一个下拉框,允许一个人在创建习惯时从所有可用列表中选择一个用户,如下所示
<%= collection_select :user, :id, @users, :id, :first_name %>
习惯控制者当然有
def new
@users = User.all
...
end
这很好用,当表单提交时会发布两个参数哈希:habit和:user。现在,当我想在create方法中处理表单输入时,我不确定如何正确使用语法并将user_id分配给新创建的习惯。我想做的就是这样的事情
def create
@habit = Habit.new(params[:habit], params[:user])
end
当然,这是不正确的语法。
def create
@habit = Habit.new(params[:habit])
end
正确地从:habit hash中指定params,但是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
所以我的问题是,当处理一个在多个哈希中发布数据的表单时,将这些参数传递给控制器中某些方法的正确方法是什么?
答案 0 :(得分:2)
所以我的问题是,当处理一个在多个哈希中发布数据的表单时,将这些参数传递给控制器中某些方法的正确方法是什么?
不要说Habit.new( <lots of stuff> )
,而是使用Habit.new(params[:habit])
。 Rails将尝试将散列中的每个键(在本例中为params[:habit]
散列的键)分配给对象上的匹配值。
因此,如果params [:habit]具有:description
键,则会将其分配给模型上名为description
的字段。这称为质量分配,非常方便。
现在你可以这样做:
@habit = Habit.new(params[:habit])
@habit.user_id = params[:user][:id]
您可能需要阅读 RoR Getting Started Guide ,例如 this section ,以获得更多类似Rails的便捷功能。
答案 1 :(得分:0)
更改
<%= collection_select :user, :id, @users, :id, :first_name %>
要
<%= collection_select :habit, :user_id, @users, :id, :first_name %>
现有的脚手架代码应该在那之后才能工作
替代
<%= f.select :user_id, @users, :id, :first_name %>