在Rails路由中访问current_user

时间:2016-01-28 05:34:43

标签: ruby-on-rails devise routes url-routing

请原谅我......我知道还有其他帖子有类似的标题,但我没有看到我的问题......

我正在尝试创建一个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。

有人可以帮忙吗?感谢。

2 个答案:

答案 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_idCanCanCan进行授权。

基本上,您尝试做的是允许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