如何在rails中以嵌套形式更新子记录

时间:2014-01-03 04:01:35

标签: ruby-on-rails

在提交下面的表单时,如何更新子代“产品”行的集合。

非常感谢

class User < ActiveRecord::Base                                                                                                                                                                             
   has_many :products, :class_name => 'Product', :inverse_of => :user                                                                                                                                       
   accepts_nested_attributes_for :products                                                                                                                                                                  
end                                                                                                                                                                                                         

class Product < ActiveRecord::Base                                                                                                                                                                          
    belongs_to :user, :inverse_of => :products                                                                                                                                                          
end   

视图

<%= form_for(@user) do |f| %>                                                                                                                                                                               

  <div class="field">                                                                                                                                                                                       
    <%= f.label :name %><br>                                                                                                                                                                                
    <%= f.text_field :name %>                                                                                                                                                                               
  </div>                                                                                                                                                                                                    
  <%= f.fields_for :products do |builder| %>                                                                                                                                                                
      <% builder.text_field :name %>                                                                                                                                                                    
  <% end %>                                                                                                                                                                                                 
  <div class="actions">                                                                                                                                                                                     
    <%= f.submit %>                                                                                                                                                                                         
  </div>                                                                                                                                                                                                    
<% end %>                                                                                                                                                                                                   

1 个答案:

答案 0 :(得分:0)

这里有一点update动作:

# app/controller/users_controller.rb

def update 
  # Get the user in param
  @user = User.find(params[:id])

  # Update attributes
  if @user.update_attribute(params[:user]) 
    # Redirect to :show for this user.  
    redirect_to :show
  else 
    # update_attriubtes failed.  Render the edit view. 
    render :edit
  end
end

其次,您还需要确保可以批量分配属性,以便对@user.update_attributes的调用成功。由于您没有使用适当的Rails版本标记您的问题,因此您可以为Rails 3和Rails 4执行以下操作:

  1. Rails 3 - 将您要批量指定的每个属性定义为attr_accessible
  2. Rails 4 - 允许控制器params.require(:user).permit(...)中的参数。
  3. 请注意,在您的视图中,您不会在此行上输出帮助程序text_field的结果:

    <% builder.text_field :name %> 
    

    您需要使用<%=...%>(注意等于=符号)才能在<%=...%>中输出表达式的结果。这可能只是一个错字,因为你已经在所有其他元素上正确地完成了这个。将行替换为:

    <%= builder.text_field :name %>
    

    另外,建议阅读指南的“Action Controller Overview”以获取有关控制器的详细信息。