Search code examples
ruby-on-railsrubycontrollers

Rails controller using wrong method


I'm working on a Rails project that is giving me some problems. I've got a controller characters_controller.rb that has two methods.

class CharactersController < ApplicationController

  before_action :authenticate_player!

  def view
    @character = Character.find(params[:id])
    unless @character.player_id == current_player.id
      redirect_to :root
    end
  end

  def new
  end

end

I've got routes set up for each of those.

get 'characters/:id', to: 'characters#view'
get 'characters/new', to: 'characters#new'

The first route works fine. I can get go to /characters/1 and I'm shown the appropriate view and the requested information. If I visit /characters/new I'm shown an error that references characters#view.

raise RecordNotFound, "Couldn't find #{name} with '#{primary_key}'=#{id}"

and

app/controllers/characters_controller.rb:6:in `view'

So /characters/new is trying to get a Character from the database with an id of "new" but that doesn't work well. Any idea what I may be doing wrong?


Solution

  • Order matters in routes.rb, the router will find the first route that matches.

    In your case, it would never go to characters#new, because the line above it will always match.

    A simple solution would be to swap the two lines.

    A better solution might be to use resource routing as documented in the Rails routing guide.