【问题标题】:Rails how to restrict attribute updatesRails如何限制属性更新
【发布时间】:2017-10-27 13:37:22
【问题描述】:

我有一个对象,Rating,有 2 个字段,user_idvalue

class CreateRatings < ActiveRecord::Migration[5.1]
     def change
       create_table :ratings do |t|
          t.belongs_to :user
          t.integer :user_id
          t.decimal :value
       end
     end
end

在创建时,我想将 user_id 和 value 设置为来自控制器的给定值:

@rating = Rating.create(user_id: 1, value: 2)

但是在我创建它之后,应该不可能更改 user_id 属性。只是值属性。之后:

@rating.update(user_id: 2, value: 3)

@rating.user_id 仍应返回 1,但值应为 3。

我的想法是使用 before_update 来还原更改,但这对我来说看起来不对。

还有其他方法吗?

我希望我能更清楚地说明我的问题..

谢谢

更新

控制器如下所示:

  def create
     Rating.create(rating_params)
  end

   def edit
     Rating.find(params[:id]).update(rating_params)
   end

   private

   def rating_params
      params.require(:rating).permit(:user_id, :value)
   end

【问题讨论】:

  • 这对我来说听起来完全是一团糟……为什么你有 两个 列来表示显然应该是一个布尔属性的?不要permit 某些属性,或者为某些用户角色设置一些policies ......但最重要的是,您需要向我们展示您的代码。我们无法以目前模糊的形式回答这个问题。
  • @TomLord: changeablenot_changeable 可能只是为了真实属性而选择的假名。例如photoemail
  • @SergioTulentsev:就是这样。没有意识到它利用了遮阳篷。
  • @IoaneSharvadze:谢谢,这就是我要找的,之前没找到。

标签: ruby-on-rails model beforeupdate


【解决方案1】:

您可以使用一些 strong_params 来做到这一点。更新时根本不允许user_id。大致如下:

class RatingsController
  def create
    @rating = Rating.create(create_rating_params)
    ...
  end

  def update
    @rating = Rating.find(params[:id])
    @rating.update_attributes(update_rating_params)
    ...
  end

  private

  def create_rating_params
    params.require(:rating).permit(:user_id, :value)
  end

  def update_rating_params
    params.require(:rating).permit(:value)
  end
end

【讨论】:

    猜你喜欢
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多