Rails路由依赖于当前用户

时间:2010-05-04 00:34:37

标签: ruby-on-rails routes

我想创建一个用于编辑用户个人资料的rails路径。

我不想使用/ users /:id / edit,而是想拥有像/ edit_profile这样的网址

是否可以创建一个动态路由,将/ edit_profile转换为/ users / {user's id} / edit,或者我应该在控制器中做什么?

5 个答案:

答案 0 :(得分:4)

您可能希望为此任务创建单独的控制器,但您也可以继续使用users_controller并检查是否设置了params[:id]

def edit
  if params[:id]
    @user = User.find(params[:id])
  else
    @user = current_user
  end
end

但是您应该注意/users通常路由到index操作,而不是show,如果您仍然有map.resources :users路由。但你可以设置一个不同的单一路径:

map.resources :users
map.resource :profile, :controller => "users"

这种方式/users会列出所有用户,/users/:id会显示任何用户,/profile会显示当前登录用户页面的show。要编辑自己的个人资料,请拨打“/ profile / edit”。

答案 1 :(得分:3)

由于路由和控制器有两个不同的用途,因此您需要两者。

对于控制器,假设您在会话中存储用户ID,您可以让您的编辑方法执行以下操作:

def edit
  @user = User.find(session[:user_id])
end

然后有一条看起来像这样的路线:

map.edit_profile "edit_profile", :controller => "users", :action => "edit"

此路线会为您提供名为edit_profile_path

的命名路线

答案 2 :(得分:0)

Tomas Markauskas的回答可行,但这里是Rails指南中你的问题的答案:

get 'edit_profile', to: 'users#edit'

因此,当有人访问www.yoursite.com/edit_profile时,它将路由到www.yoursite.com/users/edit。

然后,在您的控制器中,您可以使用

访问该用户
@user = User.find(session[:current_user_id])

假设您在有人登录时设置了该会话变量。另外,请不要忘记检查他们是否已登录。如果您使用资源路由(Rails默认),这将有效。

来源:http://guides.rubyonrails.org/routing.html

答案 3 :(得分:0)

将路线设为

 get '/users/:id/edit', to: 'users#edit', as: 'edit_profile'

正如此链接部分'困难'

中所述

http://augustl.com/blog/2009/styling_rails_urls/

网址将是

/users/edit_profile

由于ID不再在URL中,我们必须稍微更改一下代码。

class User < ActiveRecord::Base
  before_create :create_slug

  def to_param
    slug
  end

  def create_slug
    self.slug = self.title.parameterize
  end
end

创建用户时,标题的URL友好版本存储在数据库的slug列中。

为了更好地理解,请阅读以下链接

http://blog.teamtreehouse.com/creating-vanity-urls-in-rails

答案 4 :(得分:0)

将其写入任何家庭控制器。

def set_roots

if current_user      
  redirect_to dashboard_home_index_path
else      
  redirect_to home_index_path
end    

routes.rb文件中的

root:to =&gt; '家#set_roots'

匹配“/ find_roots”=&gt; “家#set_roots”