在views / items / edit.erb.html中,有以下代码:
<%= simple_form_for(@item) do |f| %>
<%= f.input :title, :label => "tilte" %>
<%= f.input :description, :as => :text, :label => "description" %>
<%= f.association :categories, :as => :check_boxes, :label => "Categories" %>
<%= f.submit 'submit', class: 'btn bnt-large btn-primary' %>
<% end %>
在ItemsController中,这段代码:
def edit
@item = current_user.items.find(params[:id])
@categories = current_user.categories
end
def update
@item = current_user.items.find(params[:id])
if @item.update_attributes(item_params)
flash[:success] = "updated successfully!
redirect_to items_path
else
render 'edit'
end
end
为什么只有 @ item.update_attributes(item_params)这一行,它还可以更新关联部分?有没有官方文件描述这个?我只想更多地了解这背后的魔力。我想知道它为什么会起作用。
谢谢大家。
我检查了链接,看起来这个魔法来自嵌套属性,但在我的模型中,我没有 accepts_nested_attributes_for 行,但它有效! Rails默认使用它吗?如果我选择了所有类别,它将全部更新到数据库,如果我取消其中一个,它将从数据库中销毁。
答案 0 :(得分:0)
您可以更新关联,因为您的Item类
中有此行accepts_nested_attributes_for :categories
您可以检查item_params
以确切了解发送到ORM的内容
if @item.update_attributes(item_params)
p item_params
flash[:success = "updated successfully!"
...
文档here
答案 1 :(得分:0)
update_attributes接收哈希作为参数。也许,在代码的最后,你有类似的东西:
def item_params
params.require(:item).permit(:bla, :ble, :bli)
end
这定义了控制器传递给它时将认为有效的参数。 因此,有了这个哈希,你将它发送到你的update_attributes,它就会解决问题。 鉴于允许传递的参数,您也可以传递自己制作的哈希值。像
这样的东西@items.update_attributes({ bla: "first param", ble: "second param", bli: "third param" })
有关方法here
的一些更酷的信息