Rails如何限制属性更新
Rails how to restrict attribute updates
我得到一个对象,Rating,有 2 个字段,user_id 和 value.
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 和值设置为来自控制器的给定值:
@rating = Rating.create(user_id: 1, value: 2)
但是在我创建它之后,应该无法更改user_id属性。只是 值属性 。那么在那之后:
@rating.update(user_id: 2, value: 3)
@rating.user_id 仍应 return 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
你可以用一些 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
我得到一个对象,Rating,有 2 个字段,user_id 和 value.
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 和值设置为来自控制器的给定值:
@rating = Rating.create(user_id: 1, value: 2)
但是在我创建它之后,应该无法更改user_id属性。只是 值属性 。那么在那之后:
@rating.update(user_id: 2, value: 3)
@rating.user_id 仍应 return 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
你可以用一些 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