【问题标题】:Accept Rails model attribute only if it was previously blank仅当之前为空时才接受 Rails 模型属性
【发布时间】:2011-12-21 14:19:34
【问题描述】:

我有一个 Rails 模型(与 Mongoid 一起使用),任何注册用户都可以协作编辑它。但是,我只想允许编辑任何特定属性,前提是它以前为空白或 nil。

例如,假设某人创建了一个对象,并将其title 属性设置为"Test Product"。然后另一个用户出现并想要为price 添加一个值,直到现在它一直是nil

在锁定之前输入的属性的同时,最好的方法是什么?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord mongoid activemodel


    【解决方案1】:

    查看ActiveRecord::Dirty 模块,了解一些可用于执行以下操作的实用方法:

    NON_UPDATABLE_ATTRIBUTES = [:name, :title, :price]
    before_validation :check_for_previously_set_attributes
    
    private
    def check_for_previously_set_attributes
      NON_UPDATABLE_ATTRIBUTES.each do |att|
        att = att.to_s
        # changes[att] will be an array of [prev_value, new_value] if the attribute has been changed
        errors.add(att, "cannot be updated because it has previously been set") if changes[att] && changes[att].first.present?
      end
    end
    

    【讨论】:

      【解决方案2】:

      我认为,最简单的方法是在表单本身中检查它。 如果该人无法编辑,只需在输入字段中添加 :disabled => true 即可。

      <% if @my_object.name %>
         <%= f.text_field :name, :disabled => true %>
      <% else %>
         <%= f.text_field :name, :disabled => true %>
      <% end %>    
      

      (我认为有一个更漂亮的方式来编写这段代码)

      但是通过使用这个,用户有一个视觉反馈,他不能做某事,最好不要分配某事而不是给出错误消息

      【讨论】:

      • 您仍然需要模型验证,因此用户不能只修改表单字段并提交它。
      • 好点 :) 所以我会选择 gareth 和 mine 帖子的组合
      猜你喜欢
      • 1970-01-01
      • 2016-08-19
      • 2012-03-10
      • 2016-08-29
      • 1970-01-01
      • 2016-02-29
      • 2022-01-08
      • 2018-09-08
      • 1970-01-01
      相关资源
      最近更新 更多