Skip to main content

Problems with Routes and Forms (Am I a Newb? What am I missing here?)

General • Asked by shakycode

I'm working on my TimeClock functionality for a legacy Rails 3.2.21 app and am running into problems with simple crud type forms.

I'm trying to create a new ClockEvent entry using a basic form in Rails. When I submit the form I raise an exception in the dev log:

undefined methodclock_events_path' for #<#Class:0x007feadcbbf250:0x007feadcbef298>`

Here is what my code looks like:

new.html.erb

<h4>New TimeCard Entry </h4>
<%= form_for (@clock_event) do |ce| %>
    <%= ce.collection_select(:user_id, User.employee.order("username ASC"), :id, :username, {:include_blank => true}, {:class => 'select', required: true}) %>
    <%= ce.label "Clock In" %>
    <%= ce.date_select :clock_in, order: [:month, :day, :year] %></br>
    <%= ce.time_select :clock_in, :combined => true, :minute_interval => 1, :start_hour => 00, :end_hour => 23 %>
    <%= ce.label "Clock Out" %>
    <%= ce.date_select :clock_out, order: [:month, :day, :year] %></br>
    <%= ce.time_select :clock_out, :combined => true, :minute_interval => 1, :start_hour => 00, :end_hour => 23 %>
    <%= ce.label "Station" %>
    <%= ce.collection_select(:station_id, Station.order("station_name ASC"), :id, :station_name, {:include_blank => true}, {:class => 'select', required: true}) %>

    <%= ce.button  'Create Entry', class: 'btn btn-info', data: {disable_with: "<i class='icon-spinner'></i>Creating..."} %>
<% end %>

timecards_controller

class TimecardsController < ApplicationController

  def index
    @users = User.employee.order("username ASC")
  end

  def new
    @clock_event = ClockEvent.new
  end

  def create
    parse_times!
    @clock_event = ClockEvent.new(params[:timecard])

     if @clock_event.save
       redirect_to clock_event_path, notice: "Entry added for #{@clock_event.user.username}".html_safe
      else
       render :new, notice: "Time Card Entry failed to Save".html_safe
      end
  end

  def show
    @user = User.find(params[:id])
    @clock_events = @user.clock_events.order("created_at ASC").paginate(:per_page => 10, :page => params[:page])
  end

  def edit
    @user = User.find(params[:id])
    @clock_events = @user.clock_events.order("created_at ASC").paginate(:per_page => 10, :page => params[:page])
  end

  def update
    @clock_event = ClockEvent.find(params[:clock_event][:id])
    if @clock_event.update_attributes(params[:clock_event])
        redirect_to edit_timecard_path(@clock_event.user.id), notice: "Updated Successfully".html_safe
    else
        redirect_to :back, notice: "Woops.".html_safe
    end
  end

  private

  def parse_times!
    params[:timecard].parse_time_select! :clock_in if params[:timecard].has_key? 'clock_in(5i)'
    params[:timecard].parse_time_select! :clock_out if params[:timecard].has_key? 'clock_out(5i)'
  end
end

routes.rb

resources :timecards

output of rake routes

 timecards GET    /timecards(.:format)                 timecards#index
                           POST   /timecards(.:format)                 timecards#create
              new_timecard GET    /timecards/new(.:format)             timecards#new
             edit_timecard GET    /timecards/:id/edit(.:format)        timecards#edit
                  timecard GET    /timecards/:id(.:format)             timecards#show
                           PUT    /timecards/:id(.:format)             timecards#update
                           DELETE /timecards/:id(.:format)             timecards#destroy

In my new.html.erb I'm passing the @clock_event object that's defined under the controller's new method. But it keeps giving me the

undefined methodclock_events_path' for #<#Class:0x007feadcbbf250:0x007feadcbef298>` error.

Should I be manually passing a URL path and a method for this since the instance variable does not match the controller convention? And if so, what URL should I be passing?

This seems like I'm making some newb mistakes here but I've had an AirPair expert help me with something similar and we had to do some really ugly passing of URL paths with ID to get it to work.

I'm open to feedback, criticism, and slaps on the back of the head.


Ok, I think I figured this out on my own.

The params that were being passed from the form was not [:timecard] but instead was [:clock_event]

So in my create action in the timecards_controller.rb I changed the following to get the right params hash.

def create
    parse_times!
    @clock_event = ClockEvent.new(params[:clock_event])

     if @clock_event.save
       redirect_to timecard_path(@clock_event.user.id), notice: "Entry added for #{@clock_event.user.username}".html_safe
      else
       render :new, notice: "Time Card Entry failed to Save".html_safe
      end
  end

private
  def parse_times!
    params[:clock_event].parse_time_select! :clock_in if params[:clock_event].has_key? 'clock_in(5i)'
    params[:clock_event].parse_time_select! :clock_out if params[:clock_event].has_key? 'clock_out(5i)'
  end

In the form I needed to pass the explicit url and the method of post to get this to work since I'm working with an object outside of the Rails namespace convention

<%= form_for @clock_event, url: "/timecards", method: :post do |ce| %>

Voila... It's working!

Disregard guys...


The best kinds of questions are the ones you ask and answer yourself shortly afterwards. <3


When the brainfog clears and the caffeine kicks in, it's go time :)


Login or Create An Account to join the conversation.

Subscribe to the newsletter

Join 27,623+ developers who get early access to new screencasts, articles, guides, updates, and more.

    By clicking this button, you agree to the GoRails Terms of Service and Privacy Policy.

    More of a social being? We're also on Twitter and YouTube.