【问题标题】:Why does alt_user_path(@user) link to user_path(@user)?为什么 alt_user_path(@user) 链接到 user_path(@user)?
【发布时间】:2015-02-13 20:59:54
【问题描述】:

我对模型User 有两个单独的视图,一个称为show,另一个称为alt。我正在尝试在show 视图上建立一个链接,该链接链接到alt 视图,但由于某种原因,它只是链接回show 视图。 Show 只是由标准资源路由路径定义。

routes.rb

get "users/:id_alt", :to => "users#alt", :as => :alt_user
resources :users

views/users/show.html.erb

<%= link_to "Alt", alt_user_path(@user) %>

例如,在 users/2 的显示视图中,上面的链接链接回 users/2。如何让它链接到 users/2_alt?

【问题讨论】:

  • 我不确定我是否理解您要执行的操作。 alt 应该是对User 的成员操作,路径是/users/2/alt。在 URL 中间嵌入参数似乎是个坏主意。

标签: ruby-on-rails ruby ruby-on-rails-4 path routes


【解决方案1】:

路由不能正常工作的原因是:id_alt 指定了用户模型的一个属性。例如,如果您在控制台中为 ID 为 2 的模型键入 users.id_alt,您会期望返回“2_alt”吗?

我建议路由到 users/2/alt,因为它更 RESTful。但是,如果您对 users/2_alt 死心塌地,可以检查字符串插值 #{}。

【讨论】:

  • 那么完整的路线代码会不会是这样的:get "users/:id/alt", :to =&gt; "users#alt", :as =&gt; :alt_user?因为那仍然只是路由到 users/:id。
  • 如果你使用 :as => :alt_user 你的路由不会知道 :alt_user 会是什么。为什么 :id 有效是因为如果您有一个模型(例如用户)并在其上调用“id”(User.id),您将得到 2(或任何用户的 ID)。如果由于某种原因您将 :alt_user 保存为数据库中的属性,则 :as => :alt_user 将起作用,但随后您将遇到路由错误,那么路由将是 /2 (或任何 User.alt_user)等于在数据库中。
  • 那么如何才能成功路由到 users/2/alt?
  • users/:id/alt 目前只是路由到users/:id。我怎样才能使它成为一条有自己路径的单独路线?
  • 你需要使用资源;资源:用户做资源:alt end
【解决方案2】:

你想要的正确路由是:

resources :users do
  get 'alt', on: :member
end

然后您可以使用&lt;%= link_to 'Alt', alt_user_path(@user) %&gt;,它会生成类似/users/2/alt 的墨水并使用控制器操作UsersController#alt

【讨论】:

  • :member 是如何考虑的?
  • :member 告诉它它是针对特定用户的路由。因此,特定用户将是 /users/2,而该用户的“alt”路线将是 /users/2/alt
【解决方案3】:

如果您想要拥有类似/users/2_alt 的路由,则需要配置 User 模型:

class User < ActiveRecord::Base
   def to_param
       id + "_alt"
   end
end

编辑: 我之前不太明白你的问题,所以请允许我更新我的答案。

这显然会将 /user/2_alt 映射到 show 操作。我想如果你想继续这种方式,你最好的拍摄方法是在控制器中添加逻辑:

class UserController < ApplicationController 
   def show
       if params[:id] =~ /\d_alt/
           # alt action logic
       else
           # show action logic
       end
   end
end

【讨论】:

    猜你喜欢
    • 2021-11-26
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    相关资源
    最近更新 更多