13

我需要通过多个名称访问一条路径。在我routes.rb做的

get '/route' => 'controller#edit', :as => 'name_a'
get '/route' => 'controller#edit', :as => 'name_b'

这很好用,但没有加载路由表。根据我对文档的理解,:as在调用时定义了一个辅助方法。

所以我去了我的ApplicationController并添加了

alias_method :name_b, :name_a

我删除了第二行routes.rb

但这失败了Uncaught exception: undefined method name_a for class ApplicationController

是否有任何正确的方法可以为单个路径设置两个名称?

=================编辑==================== 阐述:

Admin我使用 Devise gem 来管理 2 种用户的会话、注册、锁定等,我们称之为Guest. gem 放置得很好,但它要求明确的路线名称才能正常运行。

就我而言,就设计而言,只有注册过程不同,所以我正在尝试构建一个如下所示的结构:

app
  controllers
    users
        admin
            registration_controller.rb
        guest
            registration_controller.rb
        session_controller.rb
        password_controller.rb
        registration_controller.rb

和控制器继承自上面的registration_controller,后者继承自Devise AdminGuest

现在,为了正常工作,Devise 需要例如名称guest_user_password以及admin_user_password创建或删除密码检索。就我而言,两者都在同一路径下,因此我希望两个名称都重定向到相同的“用户/密码”控制器。

更重要的是,这就是为什么我真的想要令人振奋的原因。是我的观点不应该关心重定向到密码检索控制器时是否正在处理Admin和路由。Guest两者都是用户,所以我想同时使用user_password它们。

因此我的问题。:)

另请注意,正如我写的那样,一切正常。我只是想用“最优雅的方式”来写它。

4

2 回答 2

5

将别名放在您的 ApplicationController 中怎么样?

class ApplicationController < ActionController::Base

alias_method :route_new, :route_old
helper_method :route_new

请记住,它首先是新名称,然后是旧名称。

helper_method 调用是为了在您的视图中使用这些,而不仅仅是控制器。

如果你愿意,你可以把它放在一个名为 RouteAliases 之类的包含模块中

于 2013-11-01T14:30:00.017 回答
1

您可以将这样的内容添加到您的routes.rb

Rails.application.routes.draw do

  ...

  Rails.application.routes.named_routes.tap do |named_routes|
    named_routes['new_name'] = named_routes['real_name']
  end
end

这将创建new_name_pathnew_name_url助手。我已经用 Rails 5.0.6 对此进行了测试。

于 2017-09-14T12:13:22.773 回答