4

注:最初にこの質問をしたとき、私は物事を考えすぎていました。受け入れられた答えは、私が示した例に対して正しいです。つまり:value、text_fieldに渡すことができますが、実際にはdate_select、値セットをオーバーライドする機能がないという問題が発生していました。

その結果、これはRailsで更新されたため、を設定でき:selected => a_date、期待どおりに機能します。これはRails4にあります。


親モデルからその値を継承できるモデルがあります。これは次のように機能します。

class User < ActiveRecord::Base
  attr_accessible :field_name

  belongs_to :company

  def field_name
    if self['field_name'].nil?
      company['field_name']
    else
      self['field_name']
    end
  end

end

class Company < ActiveRecord::Base
  attr_accessible :field_name
end

次に、ユーザーを編集するためのフォームがありますが、もちろん、ユーザーの値がnilの場合、フォームにCompanyからの値が入力されますが、これは私が望むものではありません。

フォームフィールドの値をオーバーライドできるようにしたいので、User値がnilの場合、値は空になります。

試行1

理想的には、次のことができるでしょう。

<%= form_for @user do |f| %>
   <%= f.text_field :field_name, @user['field_name'] %>
<% end %>

しかし、それは機能しません。オーバーライド値を提供するメカニズムがないようです。

試行2

そこで、2番目のゲッター/セッターを作成することを考えました。

def field_name_uninherited
  self['field_name']
end

def field_name_uninherited=(value)
  self['field_name']=value
end

これで使用できるよう<%= f.text_field :field_name_uninherited %>になり、期待どおりに機能します-すばらしいです!例外:field_name日付、またはマルチパラメータ属性を使用する他のタイプの場合、次のエラーが発生します。

1 error(s) on assignment of multiparameter attributes

これは、データベースから推測されるため、これが日付フィールドであることがわからず、このフィールド(_uninheritedサフィックスが付いている)がデータベースにないためだと思います。

したがって、追加のメソッドを元のデータベースフィールドと同じタイプとしてマークする方法が必要です。


さらに、上記の例(field_nameを使用)は簡略化されたバージョンです。私は実際にhttps://github.com/colinbm/inherits_values_fromを使用して継承を処理していますが、これは質問にとって重要ではないと思います。


明らかに、同じ目標を達成するためのより良い方法があれば、私はすべての耳です。

4

2 に答える 2

15

それで、ユーザーにとってあなたの価値を表示することになると、あなたはそれが少し異なった振る舞いをしたいですか?

私がすることは:valueあなたのフォームフィールドでオプションを使うことです。このようにして、通常のように値を設定できますが、フォームフィールドに表示する値を選択します。

<%= f.text_field :company, :value => user.field_name_uninherited %>
于 2013-01-13T16:35:19.137 に答える
1

私が理解していることですが、ユーザーにフィールドデータを入力してもらい、それがnilの場合にのみ、その値に親(会社)モデルを入力する必要があります。before_saveActiveRecordオブジェクトでsaveメソッドが呼び出される直前に呼び出されるため(名前が示すとおり)、完全に機能しているように見えます。したがって、次のようなコールバックを記述できます。

    class User < ActiveRecord::Base
      attr_accessible :field_name

      before_save :override_field

      private
        def override_field
          if self.field_name.nil?
            self.field_name = company.field_name
          end
        end

このように、保存時に値がnilの場合にのみ値をオーバーライドし、新しい要素を作成するときにそのフォームフィールドを空のままにします。これがうまくいくことを願っています!

于 2013-01-13T15:38:29.237 に答える