【发布时间】:2010-09-26 14:54:40
【问题描述】:
我想在初始创建后保护字段中用户生成的条目。
我在用户设置项目时要求他们提供唯一名称,并且我想在创建后停止更改。
有没有办法在 Rails 中做到这一点?我可以先将其设置为 attr_accessible 然后将其切换为 attr_protected 吗?
干杯
【问题讨论】:
标签: ruby-on-rails model
我想在初始创建后保护字段中用户生成的条目。
我在用户设置项目时要求他们提供唯一名称,并且我想在创建后停止更改。
有没有办法在 Rails 中做到这一点?我可以先将其设置为 attr_accessible 然后将其切换为 attr_protected 吗?
干杯
【问题讨论】:
标签: ruby-on-rails model
您可以为模型添加自定义验证方法:
# Project model
validate :forbid_changing_name, on: :update
private
def forbid_changing_name
errors.add :name, "can not be changed!" if self.name_changed?
end
【讨论】:
如何将其设置为只读? attr_readonly 方法允许您这样做,请参阅:
【讨论】:
attr_readonly 不会阻止您在运行时分配属性,而是在保存期间默默地忽略它。至少,显式错误可能比这种行为更可取。另一个可取的选择是在它不是新记录时完全禁止写入。
我会将其设置为 :attr_protected 并创建一个新的“新”方法:
def self.my_new(attributes = {})
obj = new(attributes)
obj.my_protected_attribute = attributes[:protected_attribute]
obj
end
【讨论】:
如果我要这样做,我会在客户端使用 javascripts 来做。 例如:创建一个javascript函数,在用户输入值后将文本框属性设置为只读。正如我所看到的那样,客户端有两个优势
1 - 你不想通过服务器轮来锁定值 2 - 您可以灵活地允许用户根据需要更改值(通过单击按钮或其他东西)
干杯
同样的
【讨论】:
如果您知道属性的名称,您也可以在控制器中处理它
class MyModel < ActiveRecord::Base
attr_protected :super_cool
end
然后在控制器中:
def create
@my_model = MyModel.create(params[:my_model])
@my_model.super_cool = params[:my_model][:super_cool] unless params[:my_model].nil?
if @my_model.save
..
else
..
end
end
【讨论】: