0

我的内裤扭曲了。我的目标是让任何登录的人都能够编辑指南。show 操作将显示 updated_by 和 created_by 用户。有什么不对劲。

指南控制器.rb

  before_filter :authenticate_user!, only: [:new, :create, :edit, :update]
def update

    @guideline = Guideline.find(params[:id])


    respond_to do |format|
      if @guideline.update_attributes(params[:guideline])
        @guideline.update_attribute(:updated_by, current_user.id)

def show
    @guideline = Guideline.find(params[:id])
    if @guideline.updated_by
     @updated = User.find(@guideline.updated_by).profile_name
   end

      if User.find(@guideline.user_id)
     @created = User.find(@guideline.user_id).profile_name
      end

指南.rb(模型)

 attr_accessible :content, :hospital, :title, :user_id, :guideline_id, :specialty, :updated_by, :current_user

 belongs_to :user
 has_many :favourite_guidelines

我似乎能够正确分配 updated_by 。但是当我进入管理员并尝试更改指南用户时,我得到了错误:

Processing by Admin::GuidelinesController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"x+2BC0ztrqLBasL5uWskDEdars+FvSSNRvzGJuXyiA0=", "guideline"=>{"user_id"=>"13", "title"=>"URL testing", "content"=>"http://www.healme.com", "hospital"=>"Children's Hospital", "subtitle"=>"", "specialty"=>"Cardiology", "slug"=>"", "updated_by"=>""}, "commit"=>"Update Guideline", "id"=>"37-url-testing"}
  AdminUser Load (0.4ms)  SELECT "admin_users".* FROM "admin_users" WHERE "admin_users"."id" = 1 LIMIT 1
  Guideline Load (0.2ms)  SELECT "guidelines".* FROM "guidelines" WHERE "guidelines"."id" = ? LIMIT 1  [["id", "37-url-testing"]]
Completed 500 Internal Server Error in 9ms

ActiveModel::MassAssignmentSecurity::Error (Can't mass-assign protected attributes: subtitle, slug):

这是 before_filter 的问题吗?

4

4 回答 4

1

答案就在错误消息中:

ActiveModel::MassAssignmentSecurity::Error (Can't mass-assign protected attributes: subtitle, slug):

如果要批量分配这些属性,则需要将它们添加到attr_accessible模型中的列表中。

有关详细信息,请参阅http://guides.rubyonrails.org/security.html#mass-assignment 。

于 2013-02-28T08:30:46.177 回答
1

将字幕和 slug 添加到 attr_accessible 列表。

这将解决您的问题。

于 2013-02-28T08:30:47.040 回答
1

直接的工作解决方案是将subtitle和添加slugattr_accessible列表中。

请记住,即使表单不包含他们的字段,您的应用程序的用户也可以更新它们,他可以完美地使用这些字段制作查询。

不在attr_accessible列表中的字段必须单独分配,如下所示:

@guideline.subtitle = ...
@guideline.slug = ...
于 2013-02-28T08:30:49.793 回答
1

只需将字幕和 slug放入attr_accessible.

指南.rb(模型)

 attr_accessible :content, :hospital, :title, :user_id, :guideline_id, :specialty, :updated_by, :current_user, :subtitle, :slug

注意:放入任何字段attr_accessible将允许任何用户批​​量分配您通过浏览器中的表单或代码添加的属性。因此,如果您这样做,请谨慎行事,请记住您希望任何用户批​​量分配哪些字段以及您不希望分配哪些字段。

于 2013-02-28T08:31:52.730 回答