注:最初にこの質問をしたとき、私は物事を考えすぎていました。受け入れられた答えは、私が示した例に対して正しいです。つまり: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を使用して継承を処理していますが、これは質問にとって重要ではないと思います。
明らかに、同じ目標を達成するためのより良い方法があれば、私はすべての耳です。