使用控制器更新另一个控制器的属性和rails 4.1.1中的质量分配问题

时间:2014-06-11 07:59:40

标签: ruby-on-rails ruby-on-rails-4 mass-assignment update-attributes

我刚刚将我的rails应用程序从3.2.8更新到4.1.1。我做了必要的修改,使过渡尽可能顺利。我曾经使用一个控制器来更新另一个控制器的属性,如下所示:

     1. def check_rates
     2. @page_title = "Checkout"
     3. @order = Order.new(params[:order])
     4. @order.customer_ip = request.remote_ip


     5. populate_order


     6. if @order.save

     7.  session[:order_id] = @order.id
     8. @order.order_items.each do |order_item|
     9. @member = Member.find(order_item.member_id)    

    10. **@member.update_attributes(
    11. :order_id =>@order.id)**  
    12. end      
    13. respond_to do |format|
    14. format.html{ redirect_to :action => 'rate_response' } 
    15. format.js
    16. end

    17. else
    18. flash[:notice] = "Error saving buyers address." 

    19. respond_to do |format|
    20. format.html{  render :action => 'index' } 
    21. format.js

    22. end
    23. end
    24.   end

第10行和第11行抛出异常:

*WARNING: Can't mass-assign protected attributes for Member: order_id*

如果有人能帮助我解决这个问题,我将非常感激。我没有使用' attr_accessible'了。我为每个控制器使用' params.require(model_name).permit(* attributes)。但是,如果使用一个控制器来更新另一个控制器的属性呢?

MemberController:
 def member_params
 params.require(member).permit(:city_town, :country, :county_region, :description, 
 :name,:house_flat, :image,  :mob_tel, :postcode_index, :street,
 :image_temp,:latitude,:longitude, :pw_reset_code, :order_id)
 end 


 CheckoutController:
   def order_params
      params.require(:order).permit(:ship_to_house_number,
  :ship_to_street,:ship_to_city,:ship_to_postal_code,
  :ship_to_country,:sender,:receiver,:service_name,:cart_id,
  :ship_to_first_name, :ship_to_last_name,:email, :phone_number,:company_name,:county_region ) 
   end
  def member_params
  params.require(member).permit(:order_id) 
  end    

Member model:
belongs_to :order

Order model:
has_many :members

2 个答案:

答案 0 :(得分:1)

我犯了一个非常愚蠢的错误:在'params.require(model_name).permit(* args)'中,我没有将模型名称用作符号:

 params.require(member).permit(*args) ----- WRONG 
 params.require(:member).permit(*args) ---- WRIGHT

答案 1 :(得分:0)

您的错误*WARNING: Can't mass-assign protected attributes for Member: order_id*清楚地告诉您需要在允许的属性集中传递order_id。在你的members_controller.rb内,你可以制作私人方法memeber_params并执行此操作:

def member_params
  params.require(:member).permit(*attributes, :order_id) #need to add order_id here
end

有关strong parameters

的更多信息

正如Pavan所说,如果您使用nested_attributes_for,那么您的member_params将是:

def member_params
  params.require(:member).permit(*attributes, :order_attributes{order_attributes})
end

有关accepts_nested_attributes

的更多信息

修改

如果你看看你的行号。 10-11你有

<强> @ member.update_attributes( :order_id =&gt; @ order.id)

您只是将order_id传递给更新调用。 您尚未允许order_id

您需要这样做: @ member.update_attributes(member_params)