请原谅我......我知道还有其他帖子有类似的标题,但我没有看到我的问题......
我正在尝试创建一个url mysite.com/myusername/profile,我想知道如何为此创建路由。目前,用户#profile的url就是mysite.com/user/profile,但是我想让它更具体,比如说每个用户都有像JohnnySmith这样的用户名,URL就是mysite.com/JohnnySmith/轮廓。我在想像
get "/#{current_user.username}", to: "user#profile", as: user_profile
但我知道这不正确。
我也应该提一下,任何人都不可能访问mysite.com/JohnnySmith/profile ....目前的用户必须是JohnnySmith。
有人可以帮忙吗?感谢。
答案 0 :(得分:1)
如果要在路径中传递参数,则应为
get "/:username/profile", to: "user#profile", as: user_profile
请查看http://guides.rubyonrails.org/routing.html#naming-routes
然后您可以在控制器中使用params[:username]
来验证用户
if current_user.username != params[:username]
# redirect to error page
或者您可以使用cancancan gem来执行此操作。
答案 1 :(得分:0)
您需要使用friendly_id
和CanCanCan
进行授权。
基本上,您尝试做的是允许Rails通过参数处理用户名。这可以在没有friendly_id
的情况下完成,但有些笨拙。
使用friendly_id
gem可以使用以下内容:
#Gemfile
gem "friendly_id"
$ rails generate friendly_id
$ rails generate scaffold user name:string slug:string:uniq
$ rake db:migrate
#app/models/user.rb
class User < ActiveRecord::Base
extend FriendlyID
friendly_id :username, use: [:finders, :slugged]
end
然后您就可以使用:
#config/routes.rb
resources :users, path: "", only: [] do
get :profile, action: :show, on: :member #-> url.com/:id/profile
end
#app/controllers/users_controller.rb
class UsersController < ApplicationController
def show
@user = User.find params[:id]
end
end
这会自动将params[:id]
转换为User
模型的slug
属性:
<%= link_to "Profile", user_profile_path(current_user) %>
# -> url.com/:current_user_name/profile
-
下一阶段是授权。
使用CanCanCan
应该只有current_user
才能查看其个人资料:
#Gemfile
gem "cancancan"
#app/models/ability.rb
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
can :read, User, id: user.id
end
end
然后,您可以在users
控制器中使用load_and_authorize_resource
:
#app/controllers/users_controller.rb
class UsersController < ApplicationController
load_and_authorize_resource
def show
end
end