Search code examples
ruby-on-railsnomethoderror

Why do I get NoMethodError in Games#new for my game form but the analog for my Users#new



I am creating a a site in RoR and and I have built the user signup and login forms. Everything works great. The thing is, I went to create another object called games, which functions almost identically to users, but when I try to interact with it I get an error. I built the forms almost exactly the same and the routing I congruent.

Here is my user new.html.erb:

    <!DOCTYPE html>
    <html>
    <body>
    <% provide(:title, 'Sign up') %>
    <h1 class="heading1" >Sign up</h1>
    <br>
      <div>
        <%= form_for(@user, :html => { :class => 'form' }) do |f| %>
          <%= render 'shared/error_messages' %>
          <%= f.label :name %>
          <%= f.text_field :name %>
        <br>
           <%= f.label :email %>
          <%= f.text_field :email %>
        <br>
          <%= f.label :username %>
          <%= f.text_field :username %>
        <br>
          <%= f.label :password %>
          <%= f.password_field :password %>
        <br>
          <%= f.label :password_confirmation, "Confirmation" %>
          <%= f.password_field :password_confirmation %>
        <br>
    <br>
          <%= f.submit "Create my account", class: "submit" %>
        <% end %>
      </div>
    </div>
    </body>
    </html>

and my users controller new and create methods:

def create
    @user = User.new(user_params)

    if @user.save
      sign_in @user
      redirect_to @user
    else
      render 'new'
    end
  end
def new
 @user =User.new
end
  private

    def user_params
        params.require(:user).permit(:name, :email, :username, :password,
                                   :password_confirmation)
    end

end

and my game new.html.erb:

<!DOCTYPE html>
<html>
<body>
<h1 class="heading1" >Create Game</h1>
<br>
  <div>
    <%= form_for(@game, :html => { :class => 'form' }) do |i| %>
      <%= i.label :title %>
      <%= i.text_field :title %>
    <br>
    <br>
      <%= i.submit "Create Game", class: "submit" %>
    <% end %>
  </div>
</div>
</body>
</html>

and my game controller:

    def create
        @game = Game.new(game_params)
        if @game.save
            redirect_to root_url
        else
            render 'create'
        end
    end

    def new
        @game = Game.new
    end

    private

    def game_params
        params.require(:game).permit(:title)
    end
end

and my routing file:

Rails.application.routes.draw do
resources :sessions, only: [:new, :create, :destroy]
 resources :users
  match '/new_game',  to: 'games#new',            via: 'get'
  match '/signup',  to: 'users#new',            via: 'get'
  match '/signin',  to: 'sessions#new',         via: 'get'
  match '/signout', to: 'sessions#destroy',     via: 'delete'

  # The priority is based upon order of creation: first created -> highest priority.
  # See how all your routes lay out with "rake routes".

  # You can have the root of your site routed with "root"
  root 'home#home'

  # Example of regular route:
  #   get 'products/:id' => 'catalog#view'

  # Example of named route that can be invoked with purchase_url(id: product.id)
  #   get 'products/:id/purchase' => 'catalog#purchase', as: :purchase

  # Example resource route (maps HTTP verbs to controller actions automatically):
  #   resources :products

  # Example resource route with options:
  #   resources :products do
  #     member do
  #       get 'short'
  #       post 'toggle'
  #     end
  #
  #     collection do
  #       get 'sold'
  #     end
  #   end

  # Example resource route with sub-resources:
  #   resources :products do
  #     resources :comments, :sales
  #     resource :seller
  #   end

  # Example resource route with more complex sub-resources:
  #   resources :products do
  #     resources :comments
  #     resources :sales do
  #       get 'recent', on: :collection
  #     end
  #   end

  # Example resource route with concerns:
  #   concern :toggleable do
  #     post 'toggle'
  #   end
  #   resources :posts, concerns: :toggleable
  #   resources :photos, concerns: :toggleable

  # Example resource route within a namespace:
  #   namespace :admin do
  #     # Directs /admin/products/* to Admin::ProductsController
  #     # (app/controllers/admin/products_controller.rb)
  #     resources :products
  #   end
end

The rails server error page reads:

NoMethodError in Games#new
Showing /Users/Karen/Desktop/BR2/app/views/games/new.html.erb where line #7 raised:

undefined method `games_path' for #<#<Class:0x007fbfd6bdb260>:0x007fbfd6bd8948>
Extracted source (around line #7):
4
5
6
7
8
9
10

  <h1 class="heading1" >Create Game</h1>
  <br>
    <div>
      <%= form_for(@game, :html => { :class => 'form' }) do |i| %>
        <%= i.label :title %>
        <%= i.text_field :title %>
    <br>

Rails.root: /Users/Karen/Desktop/BR2

Application Trace | Framework Trace | Full Trace
app/views/games/new.html.erb:7:in `_app_views_games_new_html_erb___3427370169918602482_70230959128880'
Request

Parameters:

None

I really appreciate all and any help. if there is any more information I can provide please say so.

Thank you


Solution

  • You will find that when you do bundle exec rake routes in your console, you have not actually created named routes for your games paths.

    If you're using match and you want to name a route (so you have something like games_path available), you'd have to do this:

    match `/games`, as: 'games', to: 'games#index', via: :get
    

    A much easier way is to use resources for most of your routes, and just go with the default RESTFUL paths:

    resources :games
    
    # Now you have access to '/games/new', '/games/:id',
    # '/games', etc, as well as names such as `games_path`.
    # Check `bundle exec rake routes` for all of them.
    

    See Rails Routing for more information