Rails:更新已加入的活动模型属性

时间:2016-02-06 10:16:43

标签: ruby-on-rails join activemodel associated-object

我是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?

我希望相关玩具的属性也能更新。你能帮我解决这个问题吗?

2 个答案:

答案 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包含idfirstnamelastnameemail。用户应该只能更新名字和姓氏。

您的观点:

<%= 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禁用强参数,但我强烈建议您使用此功能。