继承Devise控制器后,Rails视图中的Nil实例变量

时间:2014-06-24 04:44:55

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

首先,我的目标很简单。我想继承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保留字jankiness),重新启动我的Rails服务器(我的最终最后手段)。任何想法或建议都会非常赞赏。

1 个答案:

答案 0 :(得分:4)

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

因此,当您致电super时,父行动将其接管,工作并结束故事。您的自定义实例变量永远不会被复制到视图。

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