rogy
rogy

Reputation: 450

NoMethodError new to Rails

Ive been following some rails guides and im trying to now implement something on my own for a project im doing and have hit a snag at the first hurdle

I get this error when trying to load the page

ActionController::UrlGenerationError in StepOne#login Showing /Users/rogan/Sites/authImp/app/views/step_one/login.html.erb where line #3 raised:

No route matches {:action=>"show", :controller=>"step_one"} missing required keys: [:id] Extracted source (around line #3):

<%= form_for url: step_one_path do %>
form stuff...

then my step_one_controller.rb

class StepOneController < ApplicationController
def new

  end



  def create
    user = User.authenticate(params[:email], params[:password])
    if user
      pincode = generatePin
      puts "one use pin.#{pincode}"
      redirect_to "step_two"
    else
      flash.now.alert = "Invalid email or password"
      render "new"
    end
  end
end

this was adapter from a login system i saw in a guide that used SessionsController.rb and form_for url: sessions_path

but my simple changes seem to have broke it, i've looked at my routes as well and they all seem to be in order

edit: heres is my routes edit edit: changed everything to step_one and to removed the 's' as suggested, I now get

NoMethodError in StepOne#login
undefined method `model_name' for Hash:Class
<%= form_for url: step_one_path do %>

so from one problem to another!

AuthImp::Application.routes.draw do

  resources :users
  resources :sessions
  resource :step_one

  get "users/:id" => "users#show"
  get "sign_up" => "users#new"
  get "log_in" => "step_one#login"
  get "step_two" => "sessions#new"
  get "log_out" => "sessions#destroy", :as => "log_out"

then my rake routes is as follows

      root to: "welcome#index"

        users GET    /users(.:format)             users#index
              POST   /users(.:format)             users#create
     new_user GET    /users/new(.:format)         users#new
    edit_user GET    /users/:id/edit(.:format)    users#edit
         user GET    /users/:id(.:format)         users#show
              PATCH  /users/:id(.:format)         users#update
              PUT    /users/:id(.:format)         users#update
              DELETE /users/:id(.:format)         users#destroy
     sessions GET    /sessions(.:format)          sessions#index
              POST   /sessions(.:format)          sessions#create
  new_session GET    /sessions/new(.:format)      sessions#new
 edit_session GET    /sessions/:id/edit(.:format) sessions#edit
      session GET    /sessions/:id(.:format)      sessions#show
              PATCH  /sessions/:id(.:format)      sessions#update
              PUT    /sessions/:id(.:format)      sessions#update
              DELETE /sessions/:id(.:format)      sessions#destroy
     step_one POST   /step_one(.:format)          step_ones#create
 new_step_one GET    /step_one/new(.:format)      step_ones#new
edit_step_one GET    /step_one/edit(.:format)     step_ones#edit
              GET    /step_one(.:format)          step_ones#show
              PATCH  /step_one(.:format)          step_ones#update
              PUT    /step_one(.:format)          step_ones#update
              DELETE /step_one(.:format)          step_ones#destroy
              GET    /users/:id(.:format)         users#show
      sign_up GET    /sign_up(.:format)           users#new
       log_in GET    /log_in(.:format)            step_one#login
     step_two GET    /step_two(.:format)          sessions#new
      log_out GET    /log_out(.:format)           sessions#destroy
         root GET    /                            welcome#index

Upvotes: 0

Views: 199

Answers (3)

rogy
rogy

Reputation: 450

<%= form_tag step_one_path do |f| %>

was the form tag necessary, i was going about it wrong

thanks for all the help

Upvotes: 0

Nikolay
Nikolay

Reputation: 1392

your problem is in the naming I think, resources :step_one assumes that you define the StepOnesController (plural), not StepOneController

So, you should either rename your controller or use resource :step_one route (without the s at the end)

Upvotes: 1

dphaener
dphaener

Reputation: 150

It looks like Rails is expecting you to pass in an id to your step_one_path, so the form_for should look like this:

<%= form_for url: step_one_path(@user.id) do %>

Where @user.id would be the id of the user that the form is associated with. Hope that helps. If not, please include your routes.rb file.

Upvotes: 0

Related Questions