24

関連する 2 つのモデルがActivityありStepます。これは、のテーブルに列があることActivity has_many :stepsを意味します。Step belongs_to :activitystepsactivity_id

これは Hobo 1.3 にあるため、Rails 3.0 です。

私が望むのは、作成Stepにステップを別のステップに移動できないようにすることActivityです。activity_idフィールドを変更したくありません。

編集フォームからフィールドを削除しましたが、より強力な制約を探しています。基本的に、列が触れられていないことをupdate( on ではなく)検証したいと思います。createHobo のドキュメンテーションは Hobo 内でそのようなことを何も示唆していないので、Rails の検証を調べていますが、これまでのところ、覚えている「更新時にのみこれを行う」という制約や、何かがそうではないという検証は見つかりませんでした。変わります。

4

3 に答える 3

54

で属性を read_only として宣言できますattr_readonly :your_field_name。ただし、この属性を書き込もうとしてもエラーは発生せず、黙って失敗します。(この属性は、すべての SQL-Update で無視されます)

別のオプションとして、この場合の検証を記述するには、次のようになります。

class Step < ActiveRecord::Base
  validate :activity_id_not_changed

  private

  def activity_id_not_changed
    if activity_id_changed? && self.persisted?
      errors.add(:activity_id, "Change of activity_id not allowed!")
    end
  end
end

persisted?これが新しいレコードではなく、破棄されていない場合、true を返します。

リンク:

http://api.rubyonrails.org/classes/ActiveRecord/ReadonlyAttributes/ClassMethods.html#method-i-readonly_attributes

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-persisted-3F

于 2013-02-08T20:53:53.330 に答える
1

Hobo 許可システムでもこれを行うことができると思います: http://hobocentral.net/manual/permissions

例えば:

def update_permitted?
  acting_user.administrator && !activity_id_changed?
end
于 2013-02-09T16:36:56.880 に答える