ruby on rails - Why am I getting argument out of range exception -
im rails beginner on rails 4. im trying create wine list takes name of winery , year of bottle. here form
<%= form_for @wine |f| %> <%# render "errors", object: @wine %> <div class="form-group input-group input-group-lg"> <%= f.text_field :name, placeholder: "enter 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 %> here controller
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 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 i have wines table name:string column , year:datetime column
whenever try , create new wine argument out of range exception , highlights @wine = wine.new(wine_params) in create action. doing wrong?
my log
started "/wines/new" 127.0.0.1 @ 2013-09-04 10:55:54 -0700 processing winescontroller#new 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 "/assets/comingsoonbg.png" 127.0.0.1 @ 2013-09-04 10:55:54 -0700 started "/wines/new" 127.0.0.1 @ 2013-09-04 10:55:54 -0700 processing winescontroller#new 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" 127.0.0.1 @ 2013-09-04 10:55:59 -0700 processing winescontroller#create 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) my schema wines in schema.rb
create_table "wines", force: true |t| t.datetime "year" t.datetime "created_at" t.datetime "updated_at" t.string "name" end
date , time require me think twice! in log, params contains string year select_year. simplest solution store integer representation, if you'll need years. if later change select_date, you'll need build date object in controller extracting parts params hash. see form helpers guide more detail... well, here bit.
in view:
<%= select_date date.today, prefix: :start_date %> in controller, make date object:
date.civil(params[:start_date][:year].to_i, params[:start_date][:month].to_i, params[:start_date][:day].to_i) activerecord expects attribute have 1 entry in params hash, date objects require multiple values. date helper date_select (not select_date) pass hash rails convert, multiparameter assignment, date during mass assignment.
<%= date_select :person, :birth_date %> if used date_select, you's see in params hash:
{:person => {'birth_date(1i)' => '2008', 'birth_date(2i)' => '11', 'birth_date(3i)' => '22'}} notice keys in :person hash describe order , type of multipart object rails can figure out how create attribute (for example, hash key birth_date(2i) second component of birth_date attribute in person model object , integer).
Comments
Post a Comment