【问题标题】:Rails route dependent on current userRails 路线取决于当前用户
【发布时间】:2010-05-04 00:34:37
【问题描述】:

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

我不想使用 /users/:id/edit,而是想要一个类似 /edit_profile 的 url

是否可以创建将 /edit_profile 转换为 /users/{user's id}/edit 的动态路由,或者我应该在控制器中执行操作吗?

【问题讨论】:

  • 我认为这是一个命名路由/控制器工作。
  • 您能详细说明一下您的意思吗?谢谢!

标签: ruby-on-rails routes


【解决方案1】:

您可能希望为此任务创建一个单独的控制器,但您也可以继续使用 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”。

【讨论】:

  • 谢谢!我使用了不同的 URL 结构,但我能够使用您的答案来完成我想要的!
【解决方案2】:

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

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

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

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

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

这条路线会给你一个名为edit_profile_path的命名路线

【讨论】:

    【解决方案3】:

    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])
    

    假设您在有人登录时设置了该会话变量。另外,不要忘记检查他们是否已登录。无论您是否使用 Resourceful Routing(Rails 默认设置),这都会起作用。

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

    【讨论】:

      【解决方案4】:

      将路线设为

       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

      【讨论】:

        【解决方案5】:

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

        def set_roots

        if current_user      
          redirect_to dashboard_home_index_path
        else      
          redirect_to home_index_path
        end    
        

        结束

        在 routes.rb 文件中

        root :to => 'home#set_roots'

        匹配 "/find_roots" => "home#set_roots"

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-20
          • 1970-01-01
          • 2014-02-25
          • 2015-12-04
          • 2014-09-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多