4

Rails 4 の Rails 初心者です。ワイナリーの名前とボトルの年を取るワインリストを作成しようとしています。これが私のフォームです

<%= form_for @wine do |f| %>
    <%# render "errors", object: @wine %>
    <div class="form-group input-group input-group-lg">
        <%= f.text_field :name, placeholder: "Enter the winery name", class: "form-control input-lg" %>
    </div>
    <div class="form-group input-group input-group-lg">
        <%= select_year(Date.today, start_year: Time.now.year, end_year: Time.now.year - 90, field_name: :year, prefix: :wine) %>
    </div>
    <div class="form_group input-group">
        <%= f.submit "Add wine", class: "btn btn-success" %>
    </div>
<% end %>

これが私のコントローラーです

class WinesController < ApplicationController
  before_action :set_wine, only: [:show, :edit, :update, :destroy]

  def index
    @wines = Wine.all
  end

  def new
    @wine = Wine.new
  end

  def create
    @wine = Wine.new(wine_params)
    if @wine.save
        flash[:notice] = "Successfully created..."
        redirect_to @wine
    else
        flash.now[:error] = "There was a problem"   
        render "new"
    end
  end

  def show
  end

  def edit
  end

  def update
    if @wine.update(wine_params)
        redirect_to @wine
    else
        flash[:error] = "Something went wrong"
        render "edit"
    end
  end

  def destroy
    @wine.destroy
    redirect_to wines_path
  end

  private

    def set_wine
        @wine = Wine.find(params[:id])
    end

    def wine_params
        params.require(:wine).permit(:name, :year)
    end
end

name:string 列と year:datetime 列を持つ wines テーブルがあります

新しいワインを作成しようとするたびに、argument out of range例外が発生@wine = Wine.new(wine_params)し、作成アクションで強調表示されます。私は何を間違っていますか?

私のログ

Started GET "/wines/new" for 127.0.0.1 at 2013-09-04 10:55:54 -0700
Processing by WinesController#new as HTML
  Rendered wines/_form.html.erb (2.0ms)
  Rendered wines/new.html.erb within layouts/application (2.6ms)
  Rendered layouts/_header.html.erb (0.2ms)
  Rendered layouts/_footer.html.erb (0.1ms)
Completed 200 OK in 10ms (Views: 9.3ms | ActiveRecord: 0.0ms)


Started GET "/assets/comingsoonbg.png" for 127.0.0.1 at 2013-09-04 10:55:54 -0700


Started GET "/wines/new" for 127.0.0.1 at 2013-09-04 10:55:54 -0700
Processing by WinesController#new as HTML
  Rendered wines/_form.html.erb (2.1ms)
  Rendered wines/new.html.erb within layouts/application (2.7ms)
  Rendered layouts/_header.html.erb (0.2ms)
  Rendered layouts/_footer.html.erb (0.1ms)
Completed 200 OK in 10ms (Views: 9.8ms | ActiveRecord: 0.0ms)


Started POST "/wines" for 127.0.0.1 at 2013-09-04 10:55:59 -0700
Processing by WinesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"FCd3wvCov+mugnJuzwplKD/eVskJKgxweh1mK0pG2wM=", "wine"=>{"name"=>"kjkljhk", "year"=>"2013"}, "commit"=>"Add wine"}
Completed 500 Internal Server Error in 1ms

ArgumentError (argument out of range):
  app/controllers/wines_controller.rb:13:in `create'


  Rendered /Users/me/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_source.erb (0.7ms)
  Rendered /Users/me/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (0.9ms)
  Rendered /Users/me/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.9ms)
  Rendered /Users/me/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (16.2ms)

schema.rb のワインのスキーマ

create_table "wines", force: true do |t|
    t.datetime "year"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "name"
  end
4

1 に答える 1

6

日付と時刻は常によく考える必要があります。ログにparamsは、 からの年の文字列が含まれていますselect_year。最も簡単な解決策は、必要なのが年だけの場合、整数表現を格納することでした。後で に変更する場合は、ハッシュselect_dateからパーツを抽出して、コントローラーで Date オブジェクトを作成する必要があります。params詳細については、フォーム ヘルパー ガイドを参照してください。

ビューで:

<%= select_date Date.today, prefix: :start_date %>

コントローラーで Date オブジェクトを作成するには:

Date.civil(params[:start_date][:year].to_i, params[:start_date][:month].to_i, params[:start_date][:day].to_i)

ActiveRecord は、属性がparamsハッシュに 1 つのエントリを持つことを想定していますが、Date オブジェクトには複数の値が必要です。date ヘルパーdate_select(not select_date) は、Rails が複数パラメーターの代入を使用して一括代入中に Date に変換するハッシュを返します。

<%= date_select :person, :birth_date %>

を使用date_selectした場合、params ハッシュに次のようなものが表示されます。

{:person => {'birth_date(1i)' => '2008', 'birth_date(2i)' => '11', 'birth_date(3i)' => '22'}}

Rails が属性の作成方法を理解できるように、ハッシュのキーはマルチパート オブジェクトの順序と型を記述していることに注意してください:person(たとえば、ハッシュ キーbirth_date(2i)は Person モデル オブジェクトの属性の 2 番目のコンポーネントでありbirth_date、整数です)。 .

于 2013-09-04T20:53:23.110 に答える