在不同的控制器中设计表单

use*_*594 126 ruby-on-rails devise ruby-on-rails-3

我正在为sign_in/sign_out程序使用设计宝石.

我使用设计生成了视图文件 rails g devise views

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

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

现在,我想从不同的控制器中包含这个表单.所以在名为'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: 
Run Code Online (Sandbox Code Playgroud)

似乎form_for(资源,...)部分导致问题(如果我在原始设计sign_in页面上工作正常...我怎么能以rails方式解决这个问题?

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

我是否必须在'main'控制器中指定某些内容(资源)?

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

Rup*_*ott 236

正如Andres所说,表单调用由Devise指定的助手,因此当您从非Devise控制器访问Devise表单时不存在.

要解决此问题,您需要将以下方法添加到要在其下显示表单的控制器的帮助程序类中.或者,您可以将它们添加到应用程序帮助程序中,以使它们可以在任何位置使用.

  def resource_name
    :user
  end

  def resource
    @resource ||= User.new
  end

  def devise_mapping
    @devise_mapping ||= Devise.mappings[:user]
  end
Run Code Online (Sandbox Code Playgroud)

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

  • 读完之后,我终于明白了今天的一切. (10认同)
  • 优秀.确保它进入帮助程序,而不是控制器.此外,如果您有其他资源(例如,也可以登录的公司)并且您想要加载其表单,这可能会导致巨大的问题.确保重新定义名称,路由也可能成为问题. (6认同)
  • 要限制这些方法的范围(例如,避免命名空间与其他gem的冲突),请尝试将上述方法与`helper_method:resource_name,:resource_class,:resource,:devise_mapping`(`: resource_class`似乎是较新的Devise版本中的一项要求). (5认同)

jsp*_*jsp 8

也可以尝试这个...检查这个问题.

资源

<%= 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 %> 
Run Code Online (Sandbox Code Playgroud)