【问题标题】:Getting param from friendly url like http://localhost:3000/user/adem-balka with Rails 5使用 Rails 5 从友好的 URL 获取参数,例如 http://localhost:3000/user/adem-balka
【发布时间】:2018-02-21 00:48:45
【问题描述】:
【问题讨论】:
标签:
ruby-on-rails
ruby
url
parameters
ruby-on-rails-5
【解决方案1】:
url 中的参数名称在您的路由文件中设置。
如果您查看config/routes.rb 中的路线,您应该能够找到与用户模型对应的行。它应该看起来像这样:
get '/users/:name', to: 'users#show'
这意味着如果您转到 /users/adem-balka,params[:name] 将被设置为 'adem-balka'。然后就可以访问相应控制器函数中的参数了。
【解决方案2】:
# routes.rb
get '/users/:username' => 'users#posts'
# users_controller.rb
def posts
username = params[:username]
# etc..
end
这在Rails Docs 中被描述为路由参数。
【解决方案3】:
您要查找的是路径参数,其中adem-balka 就是params[:username]。
假设您的参数中没有正斜杠或点,这就像在您的路线中添加 /:username 一样简单,例如
get '/users/:username', to: 'users#show'
# in the controller
@user = User.find_by(username: params[:username])
Rails Routing from the Outside In 指南中涵盖了所有内容。
请注意,生成的路由resources 已经包含:id 路径参数(对于show、edit 等)。但是即使你改变了控制器,生成的助手(例如users_path(@user))也会使用这个id。
要使其与resources 一起使用,使用username 而不是id(例如users_path(@user) 给出/users/ben 而不是/users/5),您还需要覆盖to_param 方法,例如
class User < ApplicationRecord
def to_param
username #rather than id
end
end
【解决方案4】:
感谢您的回答。我向他们学习?
这解决了我的问题
@user_id = User.friendly.find(params[:id])
@posts = Post.where(user_id: @user_id)