【问题标题】:Application Helper Methods Availability应用程序帮助方法可用性
【发布时间】:2013-10-04 22:53:27
【问题描述】:

我正在使用 Rails 4 并尝试包含 koudoku stripe gem。这是我的路线:

# Added by Koudoku.
mount Koudoku::Engine, at: 'koudoku'
scope module: 'koudoku' do
    get 'pricing' => 'subscriptions#index', as: 'pricing'
end

resource :account

devise_for :users, :skip => [:sessions]
as :user do
    get '/login' => 'devise/sessions#new', :as => :new_user_session
    post '/login' => 'devise/sessions#create', :as => :user_session
    get '/logout' => 'devise/sessions#destroy', :as => :destroy_user_session
end

get '/dashboard', to: 'dashboard#index'
get '/reports/generate', to: 'reports#generate'

authenticated :user do
    root :to => 'dashboard#index', :as => :authenticated_root
end

root :to => redirect('/login')

这是我得到的错误:

undefined local variable or method `root_url

我可以很好地访问其他路由,它只是尝试从模块路由呈现应用程序助手方法(例如,我定义的自定义应用程序方法或路由方法)......这有意义吗?我该如何解决这个问题?

【问题讨论】:

  • 你找到答案了吗@jon
  • 在控制器内部尝试 helper "application" 或 helper :all 看看是否能解决问题。

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


【解决方案1】:

尝试添加“main_app”。在你的根路径之前。例如:

main_app.root_path

【讨论】:

  • 这确实有效,但在添加此引擎后,我必须在所有辅助方法之前添加它似乎很笨拙。有没有办法在引擎中要求辅助方法?
【解决方案2】:

路由层中的条件逻辑有点违背 Rails MVC 架构的意图。路由文件应该只是将 Web 请求映射到控制器,然后控制器具有条件逻辑来确定显示的内容。

在这种情况下,它有点不同,因为您想要重定向,但我个人仍然会将它放在控制器中。换句话说,将root 发送到dashboard#index,然后在该控制器的顶部(或before_filter)执行

redirect_to login_path unless current_user_authenticated?

(在这里我假设您将有一个命名路由用于登录,这将是一个很好的做法,以及一个 current_user_authenticated? 方法来检查您在重定向之前想要的任何逻辑。这将是一个更 Rails-y方法,不管它值多少钱...)

【讨论】:

  • 我同意,但是问题不在于受保护的页面...实际上效果很好...问题在于 koudoku 模块给出的“定价”页面。如果我访问该页面,则会出现该错误:(
  • 啊,明白了。您是否尝试在控制器/视图中使用root_path?另外,堆栈跟踪表明错误发生在哪里?
  • 嗯,这很奇怪——因为没有模块 root_path 工作正常。它在应用程序布局视图中。但是,一旦我转到 koudoku 所需的其他页面,它就会在应用程序视图中引发错误。几乎就像没有从 koudoku 附带的继承的应用程序控制器加载应用程序路由一样......跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
相关资源
最近更新 更多