4

この質問が無数に聞かれていることは知っていますが、まだ明らかな何かが欠けていると感じています. デフォルト値で初期化したいAddressフィールドを持つモデルが与えられた場合、たとえば.cityAwesome City

私がこれまでに試したこと:

1) ビューのデフォルト値:

# @file: /app/views/addresses/_form.html.erb
<dt><%= f.label :city %></dt>
<dd><%= f.text_field :city, :value => 'Awesome city' %></dd>

これは機能しますが、気分が良くありません。また、ユーザーはそれを変更できません。値は のままですAwesome city

2) メソッドの上書きcity:

# @file: app/models/address.rb
def city
  self[:city] ||= 'Awesome city'
end

フィールドは空にレンダリングされるため、何らかの理由で機能しません。ただし、試してみるとAddress.new.cityデフォルト値が得られます。

3) コントローラーにデフォルト値を割り当てます。

# address doesn't have a controller, we use nested forms
# belongs_to :parent
# @file: /app/controllers/parents_controller.rb
def new
  @parent = Parent.new
  @parent.build_address 
  @parent.address.city = 'Awesome city'
end    

これは実際には機能しますが、モデルではなくコントローラーにあるべきだと思います。

4) 呼び出しの追加after_initialize(はい、動作します。コールバックを上書きする必要はありません):

# @file: app/models/address.rb
after_initialize :set_default_city
def set_default_city
   self.city = 'Awesome city'
end

これも同様に機能しますが、オブジェクトがインスタンス化されるたびに呼び出されるため、これは望ましくありません。

5) JavaScript、これは極端な方法のように思えますが、これよりも簡単なはずです。

結論: デフォルト値を追加する最良の方法は何ですか? フィールドにデフォルト値を与えなければならないときはいつでも、私はそのような単純なことを一生懸命にしようとしているようです. 私が見逃している他のオプションはありますか?

編集:: Ruby 1.8.7/1.9.2でRails 3.1.4を使用しています

4

2 に答える 2

4

移行ファイルで定義できます。

class CreateAddress < ActiveRecord::Migration
  def change
    create_table :addresses do |t|
      ...
      t.string :city, default: "Awesome City"
      ...

      t.timestamps
    end
  end
end

他のオプションは、newより柔軟なコントローラーのアクションで定義することです...したがって、新しいaddressものを作成すると、デフォルト値で開始されます....

 def new
   @address = Address.new
   @address.city ||= "Awesome City"
   ...
 end

編集- モデルでデフォルト値を定義するための可能な解決策:

before_save :set_default_city
def set_default_city
   self.city ||= 'Awesome city'
end
于 2012-06-27T10:32:27.823 に答える
2

私のルビーは少し錆びていますが、

Parent < ActiveRecord::Base
  def self.custom_parent(options)
    custom_parent = self.new
    if options.empty?
      custom_parent.update_attributes(default_options)
    else
      //Iterate over all options and assign them to custom_parent
    end

    return custom_parent
  end
end

「default_options」ハッシュを作成する必要があります

これがすぐに使えるとは思いませんが、あなたは私の考えを理解していると思います

于 2012-06-27T11:15:59.277 に答える