Ruby on rails 在Rails中将字段设置为只读后';他创造了

Ruby on rails 在Rails中将字段设置为只读后';他创造了,ruby-on-rails,model,Ruby On Rails,Model,我希望在字段中的用户生成条目初始创建后对其进行保护 我要求用户在设置项目时提供一个唯一的名称,我希望在创建项目后不再更改该名称 在Rails中有没有这样做的方法?我可以先将其设置为attr\u可访问,然后将其切换为attr\u受保护吗 干杯我会将其设置为:attr\u protected并创建一个新的“新”方法: 如果我要这样做,我会在客户端使用javascripts。 例如:创建一个javascript函数,在用户输入值后将文本框属性设置为只读。正如我所看到的,这样做是客户端有两个优点 1-您

我希望在字段中的用户生成条目初始创建后对其进行保护

我要求用户在设置项目时提供一个唯一的名称,我希望在创建项目后不再更改该名称

在Rails中有没有这样做的方法?我可以先将其设置为attr\u可访问,然后将其切换为attr\u受保护吗


干杯

我会将其设置为:attr\u protected并创建一个新的“新”方法:


如果我要这样做,我会在客户端使用javascripts。 例如:创建一个javascript函数,在用户输入值后将文本框属性设置为只读。正如我所看到的,这样做是客户端有两个优点

1-您不希望通过服务器循环来锁定值 2-您可以灵活地允许用户更改值(通过单击按钮或其他方式)

干杯


sameera

如果您知道属性的名称,还可以在控制器中处理此问题

class MyModel < ActiveRecord::Base
  attr_protected :super_cool
end

您可以向模型中添加自定义验证方法:

# 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\u readonly
方法允许您执行此操作,请参阅:


-1这是“安全”风险;)。它可以在客户端进行保护,但也必须在服务器上进行保护side@klew你能解释一下你的要求吗?这似乎不是控制器中必须的,它是与模型相关的逻辑,应该留在模型中。若您在模型中确实关心它,那个么您可以在控制器中使用它,而不必考虑它。例如,如果您的代码使用一些嵌套表单并通过某个父对象保存此对象,则不会执行此任务。在这种情况下,您必须向控制器添加更多逻辑,以了解所有可能的情况。记住:肥胖的模型,瘦小的控制器。这是解决问题的有趣方法;我的恭维。你在这个答案上投了反对票的人,包括我在内,似乎与SO的精神背道而驰。@Jesse:不要把它当成是针对个人的。我不喜欢投否决票,只有当我认为这真的是一个糟糕的答案时,我才会使用它。我希望我对你的回答的另一个评论能解释这一点。谢谢克莱-这是我没有想到的解决方案。干杯值得注意的是,从rails 3.2开始,validate_on_update:foo已被validate:foo,on::updateOf vital note替换,正如API文档指定的那样:
attr_readonly
不会阻止您在运行时为属性赋值,而是在保存过程中自动忽略它。至少,显式错误可能比这种行为更可取。另一个可取的选择是,当它不是新记录时,禁止向它写信。
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
# 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