0

モデルに :birth_time というフィールドがあり、3 つのフォーム フィールドから構築しようとしていますが、かなり苦労しています。私は2つの異なるアプローチを試みました。これは、私の最初のアプローチでのフォームのスニペットです。

    <input type="text" class="span1" name="birth_time_hour" id="birth_time_hour" placeholder="hour">
    <input type="text" class="span1" name="birth_time_minute" id="birth_time_minute" placeholder="minute">
    <select name="birth_time_meridiem" id="birth_time_meridiem" class="span1">
      <option value="am">AM</option>
      <option value="pm">PM</option>
    </select>

そして私のモデル:

attr_accessible :birth_time

コントローラーでやりたいことは、これら 3 つのフォーム値を取得し、Time オブジェクトを作成して、保存する前に Pick.birth_time に設定することです。params["birth_time_hour"] の計算に問題があります。PM の場合は、Time オブジェクトを作成する前に 12 を追加します。

params["birth_time_hour"] + 12結果は にcan't convert Fixnum into String params["birth_time_hour"].to_iなりますexception class/object expected

最初にフォーム値からオブジェクトを作成する必要がありますか?

私の 2 番目のアプローチは、attr_accessible 値をモデルに追加することでした。ただし、実際にはデータベースに格納されていません。

attr_accessible :birth_time_hour, :birth_time_minute, :birth_time_meridien, :birth_time

そして、私のフォームで(simple_formを使用して):

<%= f.input :birth_time, :label => "Birth time:", :as => :tel, :input_html => { :class => 'span2' }, :placeholder => 'hour' %>

しかし、フォームをレンダリングしようとすると、それはただ爆撃します:

undefined method `birth_time_hour' for #<Pick:0x0000010657c248>

attr_accessible を使用できない理由がよくわかりません。以前はフォームにのみ存在し、データベースには存在しないパスワードフィールドで使用しました。

編集: attr_accessible と attr_accessor をbirth_time_hourに使用すると、うまく機能するようです。少なくともフォームを作成できますが、コントローラーの Pick オブジェクトの一部としてはまだ表示されません。attr_accessor とそれが何に使用されるかについての知識はほとんどありませんが、それは明らかです。

一見単純な問題を解決する方法についてのアイデアはありますか? データベースに 3 つの値すべてを保存することを提案する他の SO スレッドを読みましたが、これはすべて私に出てくるのでばかげているようです。そうでないことを心から願っています。

4

2 に答える 2

0

attr_accessible の意味について混乱しているようです。

attr_acessible は、このような属性の一括割り当てを行うことができることを意味しますmodel.update_attributes({:birth_time_hour => '1'})

しかし、モデルにフィールドbirth_time_hourがないため、明らかにこれは必要ありません。

attr_accessor が行うことに関しては、この方法でクラスのリーダーとライターを定義します

attr_accessor :my_var

#is the same as

def my_var
  @my_var
end

def my_var=(value)
  @my_var = value
end

あなたの問題に関しては、モデルで次のようにする必要があります。

def birth_time_minute
  self.birth_time.min
end

def birth_time_hour
  self.birth_time.hour
end

birth_timeが時間オブジェクトであると仮定します(これは理にかなっています)

于 2012-07-11T01:32:10.800 に答える
0

time_select を使用しないのはなぜですか? これはすべて自動的に行われます。 http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-time_select

attr_accessible :birth_time 

モデルに必要なのはこれだけです。

あなたのフォームの使用で

 <%= f.time_select :birth_time %>

time_select にはいくつかのオプションがあります。マニュアルを参照してください。


Railsでcomposed_ofを使用できます-いつ使用するのですか?composed_of


それが十分でない場合は、独自のセッター メソッドを作成するだけでよいと思います。(あなたの質問に答えるために)

def birth_time=(birth_time)
  # create the time object from birth_time

end

あなたの形で

= text_field_tag "model_name[birth_time][hr]"
= text_field_tag "model_name[birth_time][min]"
= text_field_tag "model_name[birth_time][sec]"

f.fields_for :birth_time名前を生成する方法を好む場合は、使用することもできます)

= form_for @model do |f|
    = f.fields_for :birth_time do |btf|
        - [:hr, :min, :sec].each do |n|
            = btf.text_field n

ここで、setter メソッドで、次のようなハッシュを取得します。

{ 'hr' => '12', 'min' => '16', 'sec' => '26' }

これにより、ハッシュから値を構築し、次のように設定できます。

self[:birth_time] = 

それが役立つことを願っています。他にも方法はあるかもしれませんが、これが一番簡単だと思います。

于 2012-07-10T23:54:54.907 に答える