可以建议我如何在rails
中获取这样的URLhttp://www.example.com/users/5/ian
我试过以下但不确定:
route file:
devise_for :users
resources :users do
resources :socials
end
get '/users/:id/:firstname', controller: 'users', action: 'show'
users_controller.rb
def show
@user = User.find(params[:id], params[:firstname])
end
答案 0 :(得分:1)
尝试替换此
def show
@user = User.find_by_id_and_firstname(params[:id], params[:firstname])
end
答案 1 :(得分:1)
如果您正在尝试完成的是“友好网址”,您可以通过以下方式完成:
# GET /users/1
# GET /users/joe
def show
@user = User.find_by!('id = :x OR firstname = :x', x: params[:id])
end
但是,您必须确保您在URL中使用的属性是URL安全且唯一的。通常使用单独的用户名或slug字段。 路线方面没有什么特别之处。
这些宝石提供“友好的网址”:
答案 2 :(得分:1)
如果您正在尝试实现“友好网址”,那么我建议您使用此功能:
您无需创建特殊路线:
get '/users/:id', controller: 'users', action: 'show'
相反,您的模型会覆盖to_param方法:
class User
...
def to_param
"#{id}-#{firstname.try(:parameterize)}"
end
...
end
url helper调用to_param来构建url。如果你用这种方式覆盖它,你会收到一个这样的网址:
http://localhost:3000/users/1-artloe
rails在params [:id]上找到方法调用.to_i,谢天谢地,它将字符串解释为数字,直到它到达不能成为数字的字符。
示例:
'123abcde'.to_i # 123
'123-asdf'.to_i # 123
'asdf-123'.to_i # 0
所以除了覆盖to_param之外,你不需要做任何事情。