在不同的控制器中设计窗体

我正在使用一个设计宝石进行签入/签出过程。

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

我看到有一个 design/session/new.html. erb 文件,其中包含一个登录表单。

我创建了另一个文件 design/session/_ form.html.erb,并在 new.html.erb 文件中执行了 <%= render 'form' %>,结果非常好。

现在,我想在不同的控制器中包含这个表单。因此,在一个名为“ main”的控制器中,(特别是在视图页面中)“ mains/index.html。我包含了 <%= 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:

看起来表单 for (资源,...)部分引起了问题(如果我在原始设计登录页面上工作的很好... 我怎样才能解决这个问题在轨道的方式?

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

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

我会很感激你的帮助,谢谢。

58521 次浏览

您创建的表单在从 Devise 控制器呈现时可以工作,因为“资源”是通过 Devise 定义的。看一下 设计会话控制器的实现——据我所知,您正试图复制“新”动作。“ build _ resource”方法可能就是您正在寻找的方法。

典狱长 gem 是“资源”对象的来源。如果你想深入调查,就去那里找。

正如 Andres 所说,表单调用了由 Devise 指定的 helper,因此当您从非 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 %>

我从我的一个控制器中得到了与您描述的相同的错误 undefined local variable or method "resource",因为我的控制器基类缺少以下内容(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

为了改进已接受的答案,我们使用这个助手来允许不同类型的资源:

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中用来处理登录重定向的:

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