Ruby undefined method `strftime 'for nil: NilClass

I have been working with Ruby for a short time, and today I came across this problem while working on a calendar for submitting requests. I spent time searching for various undefined method error documents in stackoverflow, ruby ​​guides, etc., as well as viewing strftime. I found a solution that partially solved my problem with try, but now it doesn’t actually pass strftime through the on-demand display, even though the rails server picks it up in the message. I can go well to my calendar and click the "New request" button, fill out the form, but when I go to this form, browsers give me this:

undefined method `strftime' for nil:NilClass Extracted source (around line #3): 1: <h1><%= @vacationrequest.request_name %></h1> 2: 3: <p class="info">Requested For <%= @vacationrequest.request_date.strftime("%B %e, %Y") %></p> 4: 5: <%= simple_format @vacationrequest.message %> 6: 

And I get this error on the Rails server:

 Started GET "/vacationrequests/1" for 127.0.0.1 at 2012-10-17 15:18:14 -0400 Processing by VacationrequestsController#show as HTML Parameters: {"id"=>"1"} ←[1m←[35mVacationrequest Load (0.0ms)←[0m SELECT "vacationrequests".* FROM "v acationrequests" WHERE "vacationrequests"."id" = ? LIMIT 1 [["id", "1"]] Rendered vacationrequests/show.html.erb within layouts/application (15.6ms) Completed 500 Internal Server Error in 31ms ActionView::Template::Error (undefined method strftime' for nil:NilClass): 1: <h1><%= @vacationrequest.request_date %></h1> 2: 3: <p class="info">Requested For <%= @vacationrequest.request_date.strftime( "%B %e, %Y") %></p> 4: 5: <%= simple_format @vacationrequest.message %> 6: app/views/vacationrequests/show.html.erb:3:inapp_views_vacationrequests_sho w_html_erb_217743956_18446544' 

This is my view:

 <h1><%= @vacationrequest.request_name %></h1> <p class="info">Requested For <%= @vacationrequest.request_date.strftime("%B %e, %Y") %></p> <%= simple_format @vacationrequest.message %> <p> <%= link_to "Edit Request", edit_vacationrequest_path(@vacationrequest) %> | <%= link_to "Back to Requests", vacationrequests_path %> </p> 

and it is _form that the user places the request information in:

 <%= form_for @vacationrequest do |f| %> <% if @vacationrequest.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(@vacationrequest.errors.count, "error") %> prohibited this request from being saved: if this continue to happens please email the error to alex@allsafeindustries.com </h2> <ul> <% @vacationrequest.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= f.label :request_name %><br /> <%= f.text_field :request_name %> </div> <div class="field"> <%= f.label :request_date %><br /> <%= f.text_field :request_date %> </div> <div class="field"> <%= f.label :message %><br /> <%= f.text_area :message %> </div> <div class="actions"> <%= f.submit %> </div> <% end %> 

Finally, here are my show and index methods in my controller:

  def index @vacationrequests = Vacationrequest.all @vacationrequests_by_date = @vacationrequests.group_by(&:request_date) @date = params[:date] ? Date.parse(params[:date]) : Date.today end def show @vacationrequest = Vacationrequest.find(params[:id]) end 

Can someone direct me to what is inappropriate or why is it zero? Thanks.

In response to the answer, this is what I now get from the server:

 Started POST "/vacationrequests" for 127.0.0.1 at 2012-10-17 20:18:00 -0400 Processing by VacationrequestsController#create as HTML Parameters: {"utf8"=>"√", "authenticity_token"=>"E1+xXP0pAIQpwMZruswxIZIrTZB3b c3NlW3iRv9OLqU=", "vacationrequest"=>{"request_name"=>"One more time", "request_ date"=>"10/31/2012", "message"=>"Lucky number 7?"}, "commit"=>"Create Vacationre quest"} ←[1m←[35m (0.0ms)←[0m begin transaction ←[1m←[36mSQL (15.6ms)←[0m ←[1mINSERT INTO "vacationrequests" ("created_at", " message", "request_date", "request_name", "updated_at") VALUES (?, ?, ?, ?, ?)←[ 0m [["created_at", Thu, 18 Oct 2012 00:18:00 UTC +00:00], ["message", "Lucky nu mber 7?"], ["request_date", nil], ["request_name", "One more time"], ["updated_a t", Thu, 18 Oct 2012 00:18:00 UTC +00:00]] ←[1m←[35m (109.2ms)←[0m commit transaction Redirected to http://localhost:3000/vacationrequests/7 Completed 302 Found in 125ms (ActiveRecord: 124.8ms) Started GET "/vacationrequests/7" for 127.0.0.1 at 2012-10-17 20:18:01 -0400 Processing by VacationrequestsController#show as HTML Parameters: {"id"=>"7"} ←[1m←[36mVacationrequest Load (0.0ms)←[0m ←[1mSELECT "vacationrequests".* FRO M "vacationrequests" WHERE "vacationrequests"."id" = ? LIMIT 1←[0m [["id", "7"] ] Rendered vacationrequests/show.html.erb within layouts/application (15.6ms) Completed 500 Internal Server Error in 16ms ActionView::Template::Error (undefined method `strftime' for nil:NilClass): 1: <h1><%= @vacationrequest.request_name %></h1> 2: <%= debug @vacationrequest %> 3: <p class="info">Requested For <%= @vacationrequest.request_date.strftime( "%B %e, %Y") %></p> 4: 5: <%= simple_format @vacationrequest.message %> 6: app/views/vacationrequests/show.html.erb:3:in `_app_views_vacationrequests_sho w_html_erb___377763931_36688344' 

I also used view debugging and checked my schema, and all the attributes seemed to line up correctly.

As for the request in the comments, here is my Vacationrequest model:

 class Vacationrequest < ActiveRecord::Base attr_accessible :message, :request_name, :request_date end 

Once again I can not thank you for your help.

Here is the diagram:

 ActiveRecord::Schema.define(:version => 20121016194123) do create_table "vacationrequests", :force => true do |t| t.string "request_name" t.date "request_date" t.text "message" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false end end 

and the controller creation action code:

 def create @vacationrequest = Vacationrequest.new(params[:vacationrequest]) if @vacationrequest.save redirect_to @vacationrequest, notice: "Created Request!" else render :new end end 

As I look at this, part of the problem is that my circuit is plural and my controller is the only one? Thanks again.

+4
source share
3 answers

Shioyama thanks you for this:

validates: request_date ,: presence => true

I am really going to spend time studying debugging and checking Rails. Because of this, I realized that the datapicker in JQuery did not go right. I entered my contests> javascripts> vacationrequests.js.coffee and found that I had left () at the end, like this:

 jQuery -> $('#vacationrequest_request_date').datepicker() dateFormat: 'yy-mm-dd' 

As soon as I remove the brackets as follows:

 jQuery -> $('#vacationrequest_request_date').datepicker dateFormat: 'yy-mm-dd' 

Everything works, indexed, displayed, edited, updated, new. Thank you both for all the suggestions and show you how to do it.

0
source

First you need to make sure that the request_date is filled in, you create the record using activation checks.

Secondly, you can use the ruby ​​validation method to avoid such exceptions.

 <%= @vacationrequest.try(:request_date).try(:strftime, '%B %e, %Y') %> 

Happy coding!

+8
source

@vacationrequest.request_date is zero, so the record you are looking at is missing the request date. It looks like you have bad data. In this situation, I would debug why:

  • Drop @vacationrequest in view - <%= debug @vacationrequest %> fail @vacationrequest.inspect <%= debug @vacationrequest %> (or from your controller: fail @vacationrequest.inspect ).
  • Validation in Rails console ( rails c ) - what does Vactionrequest.find(some_id) yield do?
  • Optional by checking the database entry.

However, you enter vacation requests without storing the date of the request, so there is probably an error in your controller action, t Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model

+4
source

Source: https://habr.com/ru/post/1440403/


All Articles