10

私はレールに慣れていないので、これが簡単すぎる場合は申し訳ありません。

モデルに datetime 属性があり、3 つのフォーム要素で値を入れようとしています。最初のものは日付用で、入力フォームです (私はbootstrap-datepicker-railsを使用していますが、それを使い続けたいと思っています)。2 つ目は時間の選択ボックスを、3 つ目は分を選択したいと思います。

そのため、DateHelpers の datetime_select を使用できることがわかりましたが、bootstrap-datepicker はもう使用できません。では、複数のフォーム入力要素を使用して属性 (datetime) を入力する適切な方法は何ですか。assign_multiparameter_attributes のようなものがあることがわかりましたが、ドキュメントはあまり役に立ちません:-(

ありがとう

4

1 に答える 1

12

私には、これはコントローラーが解決する問題のように思えます。モデルはまだ有効であり、「Rails」の方法で属性を受け取っていれば問題なく動作します。私の解決策には、コントローラーがparamsハッシュを変更して、モデルがビューの変更を認識しないようにすることが含まれます。これは、プライベート API と見なされる可能性のあるActiveRecord の動作に依存するため、注意が必要です :-)

このモデルがあるとします:

# app/models/example.rb
class Example < ActiveRecord::Base
  attr_accessible :started_at    # this is a DateTime
end

ビューを調整text_field_tagして、日付部分 (bootstrap-datepicker によって拡張されます) に法線を使用time_selectし、時間部分にRails のものを使用します。

# app/views/examples/_form.html.erb
<%= form_for(@example) do |f| %>
  <p>
    <%= f.label :started_at %>
    <%= text_field_tag :started_at, @example.started_at.try(:to_date) %>
    <%= f.time_select :started_at, :ignore_date => true %>
  </p>

  <p><%= f.submit %></p>
<% end %>

このフォームは新規および永続化されたレコードtryに対してレンダリングされるため、使用していることに注意してください。これにより、属性がの場合の問題が回避されます。started_atnil

次にbefore_filter、コントローラーで を作成しparamsて、モデルに送信される前にハッシュを変更します。

class ExamplesController < ApplicationController
  before_filter :fix_params, :only => [:create, :update]

  # ...

private

  def fix_params
    date = Date.parse(params.delete(:started_at))

    params[:example].merge!({
      'started_at(1i)' => date.year.to_s,
      'started_at(2i)' => date.month.to_s,
      'started_at(3i)' => date.day.to_s
    })
  end
end

基本的に、日付として解析params[:started_at]し、それを の正しいキーに割り当てていますparams[:example]。その後、パラメータが最終的にモデルに渡されると、ActiveRecord はモデルのstarted_at属性を正しく割り当てます。

エラーチェックと検証を行う必要がありますが、これでうまくいくはずです。

于 2012-06-22T00:10:39.463 に答える