这个update_attributes代码背后的魔力是什么?

时间:2013-12-11 22:39:21

标签: ruby-on-rails

在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默认使用它吗?如果我选择了所有类别,它将全部更新到数据库,如果我取消其中一个,它将从数据库中销毁。

2 个答案:

答案 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

的一些更酷的信息