在不同的控制器中devise窗体

我正在为sign_in / sign_out程序使用devisegem。

我从devise,使用rails g devise views生成视图文件

我看到有一个包含sign_in表单的devise / sessions / new.html.erb文件。

我创build了另一个文件devise / sessions / _form.html.erb,并在new.html.erb文件中执行了<%= render 'form' %> render'form <%= render 'form' %> ,并且结果非常好。

现在,我想从不同的控制器中包含这个表单。 所以在一个名为“main”的控制器中,(特别是在视图页面内)'mains / index.html.erb'我包含了<%= render 'devise/sessions/form' %>文件。 看来,包容工作正常,但我得到以下错误。

 NameError in Mains#index Showing /home/administrator/Ruby/site_v4_ruby/app/views/devise/sessions/_form.html.erb where line #1 raised: undefined local variable or method `resource' for #<#<Class:0x007f1aa042d530>:0x007f1aa042b870> Extracted source (around line #1): 1: <%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %> 2: <p><%= f.label :email %><br /> 3: <%= f.text_field :email %></p> 4: 

似乎form_for(资源,…)的一部分是造成这个问题(这工作正常,如果我在原始的devisesign_in页面…我怎样才能解决这个问题在轨道上?

我个人更喜欢使用“渲染”function来包含表单,而不是内联编写html代码。

我必须在“主”控制器中指定一些东西(资源)吗?

我会感谢你的帮助。 谢谢。

正如Andres所说的,当你从一个非Devise控制器访问一个Devise表单时,表单调用Devise指定的助手并不存在。

为了解决这个问题,你需要把下面的方法添加到你希望显示下面的表单的控制器的helper类中。 或者,您可以将它们添加到您的应用程序帮助程序,使其在任何地方都可用。

  def resource_name :user end def resource @resource ||= User.new end def devise_mapping @devise_mapping ||= Devise.mappings[:user] end 

资料来源: http : //pupeno.com/blog/show-a-devise-log-in-form-in-another-page/

可以试试这个也…检查这个问题 。

资源

 <%= form_for("user", :url => user_session_path) do |f| %> <%= f.text_field :email %> <%= f.password_field :password %> <%= f.check_box :remember_me %> <%= f.label :remember_me %> <%= f.submit 'Sign in' %> <%= link_to "Forgot your password?", new_password_path('user') %> <% end %> 

您创build的表单在从Devise控制器呈现时工作,因为“资源”是通过Devise定义的。 看看Devise SessionsController的实现 – 据我所知,你试图复制“新”的行动。 “build_resource”方法可能是你正在寻找的。

守望者gem是“资源”对象来自的地方。 如果你想深入挖掘,那将是一个值得去看的地方。

我得到了同样的错误undefined local variable or method "resource"你从我的控制器之一,因为我的控制器基类缺less以下(Rails的API的ActionController :: API出错)描述:

 include ActionController::Helpers 

因此Devise的帮助者方法在视图中无法解决。

为了使devise工作与Rails-API我需要包括:

 class ApplicationController < ActionController::API include AbstractController::Rendering include AbstractController::Layouts include ActionController::MimeResponds include AbstractController::Translation include ActionController::ImplicitRender include ActionController::Helpers 

为了完善接受的答案,我们使用这个帮助器来允许不同types的资源:

 def resource_name @resource_name ||= if admin_controller? :admin_user else :user end end def resource @resource ||= resource_name.to_s.classify.constantize.new end def devise_mapping @devise_mapping ||= Devise.mappings[resource_name] end 

在哪里admin_controller? 是我们在ApplicationController中处理loginredirect之前的事情:

 def admin_controller? !devise_controller? and request.path =~ /^\/admin/ end helper_method :admin_controller?