首先,我的目标很简单。我想继承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服务器(我的最终最后手段)。任何想法或建议都会非常赞赏。
答案 0 :(得分:4)
Devise父控制器中的匹配操作具有完整的渲染机制。
因此,当您致电super
时,父行动将其接管,工作并结束故事。您的自定义实例变量永远不会被复制到视图。
要定义自定义内容,请在super
之前执行或完全覆盖父操作。