首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在不同的控制器中设计窗体

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

Stack Overflow用户
提问于 2010-11-03 04:18:34
回答 5查看 57.6K关注 0票数 130

我正在使用一个设计性的gem来执行登录/登出过程。

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

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

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

现在,我想包含来自不同控制器的表单。因此,在名为'main‘的控制器中(具体地说,在视图页面中) 'mains/index.html.erb’,我包含了<%= render 'devise/sessions/form' %>文件。看起来inclusion运行得很好,但我得到了以下错误。

代码语言:javascript
复制
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(资源,...)部分导致了问题(如果我在原始的devise sign_in页面上,它工作得很好...我如何用rails的方式解决这个问题呢?

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

我必须在'main‘控制器中指定一些东西(资源)吗?

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-06-18 08:48:31

正如Andres所说,表单调用由Devise指定的帮助器,因此当您从非Devise控制器访问Devise表单时不会出现。

要解决此问题,您需要将以下方法添加到要在其下显示窗体的控制器的helper类中。或者,您可以将它们添加到您的应用程序帮助器中,以便在任何地方都可以使用它们。

代码语言:javascript
复制
  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/

票数 248
EN

Stack Overflow用户

发布于 2013-03-26 10:43:53

可以尝试这个also...check这个question

Source

代码语言:javascript
复制
<%= 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 %> 
票数 8
EN

Stack Overflow用户

发布于 2010-11-03 06:16:46

您创建的表单在从Devise控制器呈现时可以正常工作,因为“资源”是通过Devise定义的。看看Devise SessionsController的实现--据我所知,您正在尝试复制“新”操作。"build_resource“方法可能就是您想要的。

Warden gem是“资源”对象的来源。如果你想深入挖掘,那将是寻找的地方。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4081744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档