【问题标题】:Nil instance variables in Rails view after subclassing Devise controller子类化设计控制器后,Rails 视图中的 Nil 实例变量
【发布时间】:2014-06-24 04:44:55
【问题描述】:

首先,我的目标很简单。我想继承 Devise 的 RegistrationsController 以覆盖它的一些功能,特别是 new 方法。根据 Devise 团队看似简单的文档,我构建了一个自定义控制器,如下所示:

class Members::RegistrationsController < Devise::RegistrationsController
    def new
        super
        puts 'I am being called!'
        @var = 'This is a sentence going into a variable.'
        puts "@var is: #{ @var }"
    end
end

现在这个文件的路径是PROJECT/app/controllers/members/registrations_controller.rb 一切都按预期输出......我们在这里似乎很好。

转到我的观点,问题最明显的地方,我发现@var 始终是nil。这让我很沮丧。

<h2>This is a custom sign up view.</h2>
<p>
    <%= @var %>
</p>
<p>
    Is @var nil?... <%= @var == nil %>
</p>

...Devise form stuff

所以不仅@var 不会在 HTML 中呈现,而且@var == nil 会呈现为 true。 这个文件的路径是PROJECT/app/views/members/registrations/new.html.erb。看到我实现了自定义输出,我相信这个文件也处于正常工作状态。

最后,我想我可能会将我的一些 routes.rb 文件放入其中,以防它对问题有所启发。

PROJECT::Application.routes.draw do
  devise_for :members, :controllers => { :registrations => "members/registrations" }
  devise_for :affiliates
  devise_for :admins

  root 'home#index'

  ...more routing stuff

end

我不是专家,但这似乎很容易,但我迷路了。为了解决我的问题,我已经完成了所有工作,从使用不同的变量名(以防我不知道某些 var 保留字 jankness)到重新启动我的 Rails 服务器(我最后的最后手段)。任何想法或建议将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 devise


    【解决方案1】:

    Devise父控制器中的匹配动作具有完整的渲染机制。

    因此,当您致电 super 时,父操作会接管它,开始工作并结束故事。您的自定义实例变量从未有机会被复制到查看。

    要定义自定义事物,请在 super 之前执行或完全覆盖父操作。

    【讨论】:

    • 太好了。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    相关资源
    最近更新 更多