我是RoR的新手。 我的问题是关于更新相关的Active Model' s attr。
class User
has_many :toys
end
class Toy
belongs_to :user
end
我有一个用户形式的页面,我可以更新用户的属性,以及相关user_devices的某些属性:
<%= f.text_field :age %> # from user
<%= f.text_field :email %> # from user
....
<%= f.check_box :is_new %> # from toy!!
当我发布表单并使用update_attributes()更新所有属性时,它显示&#34; ActiveModel :: MassAssignmentSecurity :: Error&#34;
@user.update_attributes(params[:user]) # it gives ActiveModel::MassAssignmentSecurity::Error
另一个问题是,我不知道如何命名&#34; is_new&#34;属于玩具表中的属性..应该是:toys_is_new?
我希望相关玩具的属性也能更新。你能帮我解决这个问题吗?
答案 0 :(得分:1)
由于is_new?
来自Toy
,您必须使用accepts_nested_attributes_for
:
#app/models/user.rb
class User < ActiveRecord::Base
has_many :toys
accepts_nested_attributes_for :toys
end
#app/controllers/users_controller.rb
class UsersController < ApplicationController
def edit
@user = User.find params[:id]
end
def update
@user = User.find params[:id]
@user.update user_params
end
private
def user_params
params.require(:user).permit(:age, :email, toys_attributes: [:is_new])
end
end
要在view
中使用此功能,您需要使用fields_for
帮助程序:
#app/views/users/edit.html.erb
<%= form_for @user do |f| %>
<%= f.fields_for :toys, @user.toys do |t| %>
<%= t.object.name %>
<%= t.check_box :is_new %>
<% end %>
<%= f.submit %>
<% end %>
答案 1 :(得分:0)
您必须使用Strong Parameters。它是在Rails 4中引入的。
示例:
您的模型User
包含id
,firstname
,lastname
,email
。用户应该只能更新名字和姓氏。
您的观点:
<%= form_for @user do |f| %>
<%= f.text_field :firstname %>
<%= f.text_field :lastname %>
<%= f.submit %>
<% end %>
您的控制器:
before_action :set_user
def edit
end
def create
if @user.update user_params
# Set success message
# redirect to proper site
else
# Set error
render :edit
end
end
private
def set_user
@user = User.find(params[:id]) # Rescue against ActiveRecord::RecordNotFound error
end
def user_params
params.require(:user).permit(:firstname, :lastname) # Here the strong parameters stuff happens
end
如果您想允许更多参数,只需将它们添加到permit
方法调用中即可。
出于安全原因,您收到此错误。
您可以使用config.action_controller.permit_all_parameters = true
禁用强参数,但我强烈建议您使用此功能。