Search code examples
ruby-on-railsnested-routes

Rails Nested Resource Routes


I'm fairly new to rails and I don't think I'm understanding the routing completely. When I try to access the edit action I get the following error:

ActiveRecord::RecordNotFound in StoreController#show

Couldn't find Gear with id=edit
Rails.root: /Users/dave/rails_projects/outdoor

Application Trace | Framework Trace | Full Trace
app/controllers/store_controller.rb:7:in `show'
Request

Parameters:

{"user_id"=>"104",
 "id"=>"edit"}
Show session dump

Show env dump

Response

Headers:

None

Here is my view with the link that is throwing this error:

    <li><%= link_to "Store Appearance", edit_user_store_path(@user) %></li>

Here is my nested route:

  resources :users do
    resources :store
  end

Here is my controller

class StoreController < ApplicationController
  def index
     @store = current_user.gears.paginate(page: params[:page])
  end

  def show
     @gears = Gear.find(params[:id]).user.gears.paginate(page: params[:page])
  end

  def edit
  end

  def update
  end
end

Model Store

class Store < ActiveRecord::Base
  attr_accessible :storeimage, :storename
  belongs_to :user

  validates :user_id, :presence => true

end

Model User

class User < ActiveRecord::Base

  attr_accessible :first_name, :last_name, :email, :password, :password_confirmation, :userimage, :remove_userimage
  has_secure_password
  has_many :gears
  has_many :comments, :dependent => :destroy 
  has_one :store, :dependent => :destroy
  before_save :create_remember_token
  require 'carrierwave/orm/activerecord'
  mount_uploader :userimage, UserpicUploader

  email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :first_name,  presence: true,
                          length:  {:maximum => 50 }
  validates :last_name,  presence: true,
                         length:  {:maximum => 50 }
  validates :email,      presence: true,
                         format:  {:with => email_regex},
                         uniqueness:  {:case_sensitive => false}
  validates :password,   presence: true,
                         confirmation: true,
                         length: {within: 6..40}

  include Tire::Model::Search
  include Tire::Model::Callbacks

  def name
   first_name + " " + last_name
  end

  private

    def create_remember_token
        self.remember_token = SecureRandom.urlsafe_base64
    end

end

Please help.


Solution

  • You need to pass both the user_id and id params in the URL when you're accessing a store object nested under a user, so your URL should look like this:

    /users/1/stores/3/edit
    

    Versus:

    /users/1/stores/edit
    

    You also need to pass both of those as arguments to your path helper, ie:

    edit_user_store_path(@user, @store)