我刚刚将我的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
答案 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
的更多信息
或强>
正如Pavan
所说,如果您使用nested_attributes_for
,那么您的member_params将是:
def member_params
params.require(:member).permit(*attributes, :order_attributes{order_attributes})
end
的更多信息
修改强>
如果你看看你的行号。 10-11你有
<强> @ member.update_attributes( :order_id =&gt; @ order.id)
您只是将order_id传递给更新调用。 您尚未允许order_id
您需要这样做: @ member.update_attributes(member_params)