设计渲染标志=>代码中的其他地方的部分 [英] Devise render sign => up/in form partials elsewhere in code
问题描述
截至目前,在我的家庭控制器,代表我的家/页面我有两个链接,链接到注册=> 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
这篇关于设计渲染标志=>代码中的其他地方的部分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!