params通过名称而不是id来查找

时间:2015-12-30 05:26:29

标签: ruby-on-rails ruby-on-rails-4 params

我希望网址结构为' actors / joe-blogs'而不是'演员/ 1'但是由于网址中的id,我无法通过名称找到params,而不是通过id找到。

我有以下路线

get 'actors/:name' => 'actors#show'

演员表

| id |   name    |
------------------
| 1  | Joe Blogs |

url / actors / joe-blogs工作正常但是按名称而不是id查找params并不起作用。

演员控制器:

    def show
       @actor = Actor.find(params[:name])
    end

通过params名称查找具有{"name"=>"joe-blogs"}的演员,而不是使用{"name"=>"Joe Blogs"}

查找演员

如何让params工作以便抓取{"name"=>"Joe Blogs"}?没有' - '在这个名字之间?

2 个答案:

答案 0 :(得分:4)

您应该使用find_by代替find

def show
  @actor = Actor.find_by(name: params[:name])
end

答案 1 :(得分:0)

您最好使用friendly_id,这将为您解决所有这些功能。除了在数据表中添加slug列之外,您不必更改任何内容:

#Gemfile
gem 'friendly_id', '~> 5.1'

$ rails generate friendly_id
$ rails generate scaffold actor name:string slug:string:uniq
$ rake db:migrate

#app/models/actor.rb
class Actor < ActiveRecord::Base
   extend FriendlyID
   friendly_id :name, use: [:slugged, :finders]
end

$ rails c
$ Actor.find_each(&:save)

这应该将您的所有Author记录设置为slug,这样您就可以使用以下内容:

#config/routes.rb
resources :actors #-> no change required

#app/controllers/actors_controller.rb
class AuthorsController < ApplicationController
   def show
      @author = Actor.find params[:id] #-> will automatically populate with slug
   end
end