设计渲染标志=>代码中的其他地方的部分 [英] Devise render sign => up/in form partials elsewhere in code

查看:101
本文介绍了设计渲染标志=>代码中的其他地方的部分的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚从Devise和Rails3开始。我有Authenetication下来和工作,并了解基础。



截至目前,在我的家庭控制器,代表我的家/页面我有两个链接,链接到注册=> sign_up,一个根据login / logout => sign_in / sign_out而改变。



但是,我不想将用户重定向到登录页面。相反,我想在我的首页上显示我的登录表单。所以我已经将视图和_form.html.erb部分的 devise / session / new template int分开。



现在在我的家庭视图中,我渲染登录表单如下:

 <%if user_signed_in? %GT; 
欢迎:< b><%= current_user.username%> (<%= current_user.group.name%>)< / b>
<%= link_to注销,destroy_user_session_path,:method => 'delete'%>
<%else%>
<%= render'devise / sessions / form'%> //渲染部分在这里
<%= link_to登录,new_user_session_path%>
<%end%>
< hr>

这是部分代码:

 <%= form_for(resource,:as => resource_name,:url => session_path(resource_name))do | f | %GT; 
< div><%= f.label:email%>< br />
<%= f.email_field:email,:autofocus => true%>< / div>

< div><%= f.label:password%>< br />
<%= f.password_field:password%>< / div>

<%if devise_mapping.rememberable? - %GT;
< div><%= f.check_box:remember_me%> <%= f.label:remember_me%>< / div>
<%end - %>

< div><%= f.submit登录%>< / div>
<%end%>

我的错误如下:

  HomeError in Home#index 

显示设计/会话/ _form.html.erb,其中第1行上升:

未定义的局部变量或#<#< Class:0x614ec68>:0x6157ff8>的方法`resource'
提取源(绕行#1):

1:<%= form_for(resource,:as => resource_name,:url => session_path(resource_name) F | %GT;
2:< div><%= f.label:email%>< br />
3:<%= f.email_field:email,:autofocus => true%>< / div>
4:

我明白为什么错误发生。这是因为它没有被赋予资源属性。我使用 dump(resource),原来它是一个用户模型/对象所以我添加了以下内容:

 <%if @user%> 
<%resource = @user%>
<%end%>

并添加以下到我的主页控制器索引方法:

  def index 
@user = User.new
end

然而,之后,我得到resource_name错误,原来简单地是:user ,如果我设置,那么我得到一个问题,因为 devise_mapping.rememberable?我不知道如何提供。



我想要正确地做到这一点,所以我想避免

解决方案

看看这个问题的答案:在不同的控制器内改变表单



您尝试使用家庭控制器呈现的表单依赖于Devise定义的帮助者,无法从非Devise控制器访问。



将必要的助手添加到你的home_help er.rb应该解决你的问题:

  def resource_name 
:user
end

def resource
@resource || = User.new
end

def devise_mapping
@devise_mapping || = Devise.mappings [:user]
end


I'm just starting with Devise and Rails3. I have the Authenetication down and working and understand the basics.

As of now in my Home Controller that represents my Home/Front Page i have two links one that links to Register => sign_up and one that changes depending on login/logout => sign_in/sign_out.

However i dont want to redirect my user to login page. Instead i want to display my login form on my front page. So i have seperated the devise/session/new template int to a view and a _form.html.erb partial.

And now in my home view i render the login form as so:

<% if user_signed_in? %>
    Welcome: <b><%= current_user.username %> (<%= current_user.group.name %>)</b>
    <%= link_to "Logout", destroy_user_session_path, :method => 'delete' %>
<% else %>
    <%= render 'devise/sessions/form' %> // Rendering the partial here
    <%= link_to "Login", new_user_session_path %>
<% end %>
<hr>

This is the code of the partial:

<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
  <div><%= f.label :email %><br />
  <%= f.email_field :email, :autofocus => true %></div>

  <div><%= f.label :password %><br />
  <%= f.password_field :password %></div>

  <% if devise_mapping.rememberable? -%>
    <div><%= f.check_box :remember_me %> <%= f.label :remember_me %></div>
  <% end -%>

  <div><%= f.submit "Sign in" %></div>
<% end %>

My error is as follows:

NameError in Home#index

Showing devise/sessions/_form.html.erb where line #1 raised:

undefined local variable or method `resource' for #<#<Class:0x614ec68>:0x6157ff8>
Extracted source (around line #1):

1: <%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
2:   <div><%= f.label :email %><br />
3:   <%= f.email_field :email, :autofocus => true %></div>
4: 

I understand why the error happens. It's because the partial it not being given the resource attribute. I used dump(resource) and it turns out it's a User model/object So i added the following before it:

<% if @user %>
   <% resource = @user %>
<% end %>

And added following to my Home controller index method:

def index
   @user = User.new
end

However after that i get resource_name error that turns out to simply be :user and if i set that then i get a problem because of devise_mapping.rememberable? which i dont know how to provide.

I want to do this properly so i want to avoid messy and unlogical approach that i started.

解决方案

Take a look at the answer to this question: Devise form within a different controller

The form you are attempting to render with your Home controller relies on helpers defined by Devise that are not accessible from a non-Devise controller.

Adding the necessary helpers to your home_helper.rb should solve your problem:

def resource_name
:user
end

def resource
@resource ||= User.new
end

def devise_mapping
@devise_mapping ||= Devise.mappings[:user]
end

这篇关于设计渲染标志=&gt;代码中的其他地方的部分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆