【问题标题】:Alias route's name别名路线名称
【发布时间】:2013-03-27 02:01:48
【问题描述】:

我需要一个路径可以通过多个名称访问。在我的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 失败

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

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

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

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

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

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

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

更重要的是,这就是我真正想要的原因。是我的观点不应该关心重定向到密码检索控制器时它是否正在处理AdminGuest 路由。两者都是用户,所以我想对两者都使用user_password

因此我的问题。 :)

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

【问题讨论】:

  • :as => 'name_a' 为路由创建了一个别名,例如 name_a_path 和 name_b_path,它是一种路由机制,不会发生在控制器中。
  • 所以这意味着不,除了加载路由表别无他法。 :( 谢谢。
  • 为什么你需要用不同的名字引用相同的路径?
  • 因为宝石要求我不尊重的名字:)
  • “因为宝石要求我不尊重的名字”+1 我同意这一点。

标签: ruby-on-rails devise routes


【解决方案1】:

把别名放在你的ApplicationController中怎么样?

class ApplicationController < ActionController::Base

alias_method :route_new, :route_old
helper_method :route_new

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

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

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

【讨论】:

  • 这不会向应用程序添加任何公共路由。
  • @muichkine 也不应该,你为什么需要一条新路线?但是你知道你需要调用它 alias_method: :route_new_path, :route_old_path 对吧?
  • 一条新路线将为第 3 方集成商阐明 API。但实际上我找到了我的解决方案 `resources :goods, :controller => :items ,:type => 'Good' resources :services, :controller => :items ,:type => 'Service' `
  • 我在启动服务器时收到一个未定义的方法错误。有趣的是,如果我注释掉代码,启动服务器,然后取消注释并让 rails autoload 启动它就可以工作了。
【解决方案2】:

您可以在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 对此进行了测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2015-02-12
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多