我希望网址结构为' 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"}
?没有' - '在这个名字之间?
答案 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