Rails routes with :name instead of :id url parameters

前端 未结 7 1948
渐次进展
渐次进展 2020-12-05 13:05

I have a controller named \'companies\' and rather than the urls for each company being denoted with an :id I\'d like to have the url use their :name such as: url/comp

7条回答
  •  抹茶落季
    2020-12-05 13:48

    params

    The bottom line is you're looking at the wrong solution - the params hash keys are rather irrelevant, you need to be able to use the data contained inside them more effectively.

    Your routes will be constructed as:

    #config/routes.rb
    resources :controller #-> domain.com/controller/:id
    

    This means if you request this route: domain.com/controller/your_resource, the params[:id] hash value will be your_resource (doesn't matter if it's called params[:name] or params[:id])

    --

    friendly_id

    The reason you have several answers recommending friendly_id is because this overrides the find method of ActiveRecord, allowing you to use a slug in your query:

    #app/models/model.rb
    Class Model < ActiveRecord::Base
      extend FriendlyId
      friendly_id :name, use: [:slugged, :finders]
    end
    

    This allows you to do this:

    #app/controllers/your_controller.rb
    def show
        @model = Model.find params[:id] #-> this can be the "name" of your record, or "id"
    end
    

提交回复
热议问题