0

検証エラーの後にselect_dayの値を保持するにはどうすればよいですか? 次のようにデフォルト値を設定できます。

f.select_day 1, {prefix: 'user[birthdate]'}

しかし、モデルから値を設定するためにこのようにすることはできません:

f.select_day :birthdate, {prefix: 'user[birthdate]'}

エラー:

ActionView::Template::Error (undefined method `day' for :birthdate:Symbol)

それは可能ですか、それとも params から手動で値を取得して設定する必要がありますか?
モデル:

class User
  include ActiveModel::Model
  include ActiveRecord::AttributeAssignment
  attr_accessor :birthdate
  def self.build(request, params = {})
    u = self.new
    u.assign_attributes(params)
    u
  end
end

コントローラ:

def new
  @user = User.new
end

def create
  @user = User.build(params[:user])
end

見る:

= form_for @user do |f|
  f.select_day 1, {prefix: 'user[birthdate]'}
  f.select_month 1, {prefix: 'user[birthdate]'}
  f.select_year 1990, {prefix: 'user[birthdate]'}
4

4 に答える 4

2

select_day (および _month と _year)のドキュメントを確認すると、メソッドは通常、最初のパラメーターに日付を受け入れることがわかります。また、あなたが選択したように整数も受け入れますが、それは明らかに代替の実装です。

とはいえ、いくつかの小さな変更をお勧めします。まず、これらの方針に沿って User クラスのデフォルトの生年月日を設定することを強く検討します。

class User
  attr_accessor :birthdate

  def initialize()
    @birthdate = Date.new 1990, 1, 1
    super
  end

  ...
end

その後、フォームは、新しいビューと編集ビューの両方で User#birthdate アクセサーを利用できます。

= form_for @user do |f|
  = f.select_day @user.birthdate, prefix: 'user[birthdate]'
  = f.select_month @user.birthdate, prefix: 'user[birthdate]'
  = f.select_year @user.birthdate, prefix: 'user[birthdate]'
于 2013-11-14T20:52:34.417 に答える
2

アプローチ 1 (ハッキー):

あなたが求めているのは、assign_multiparameter_attributesによって行われるマルチパラメータの割り当てです。

フォームを次のように変更します。

= select_day @user.birthdate, prefix: "user", field_name: "birthdate(3i)"
= select_month @user.birthdate, prefix: "user", field_name: "birthdate(2i)"
= select_year @user.birthdate, prefix: "user", field_name: "birthdate(1i)"

assign_multiparameter_attributes値を設定するには、列の型がわかっている必要があります。それが機能するには、と呼ばれるメソッドが必要ですcolumn_for_attribute(name)

attr_accessor :birthdate

def column_for_attribute(name)
  return ActiveRecord::ConnectionAdapters::Column.new(:birthdate, nil, "date") if name.to_sym == :birthdate
end

ActiveRecordこれが、 DB なしでモジュールを使用することが悪い考えである理由です。

アプローチ 2 (ActiveModel の強化):

これを見てください。BaseModel日付の割り当てを処理する を作成しようとします。

アプローチ 3 (カスタム コード):

gem を使用したくない場合は、3 つの属性を導入し(day, month, year) 、これら 3 つの属性からオブジェクトを作成Userするメソッドを呼び出す方法があります。birthdateDate

多くの場所で同様の要件がある場合は、ActiveModel を強化することをお勧めします (アプローチ 2)。ただし、この要件が 1 か所だけである場合は、アプローチ 3 を使用してください。

于 2013-11-12T08:13:04.687 に答える
0

完全選択select_datetimeオプションを使用してみましたか? これにより、日付を挿入するために必要なすべてのフィールドが自動的に生成されます。

JQueryUI datepickerのようなものを使用して、通常のテキスト フィールドを使用し、日付を選択するための素敵な小さなポップアップを提供することもできます。また、ユーザーが必要に応じて日付を入力することもできます。

于 2013-11-15T16:22:00.827 に答える
-1

多分あなたはやろうとすることができます:

= f.select_day f.object.birthday, {prefix: 'user[birthdate]'}
于 2013-11-11T09:37:55.733 に答える