5

我刚刚开始使用Devise和Rails3。我已经认证了,并且了解了基础知识。设计render sign => up /在其他地方的代码形式

截至目前在我的家庭控制器代表我的家庭/首页,我有两个链接,一个链接到Register => sign_up,另一个根据登录/注销=> sign_in/sign_out而改变。

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

现在在我家查看我呈现的登录表单像这样:

<% 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> 

这是部分的代码:

<%= 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 %> 

我的错误如下:

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: 

我明白错误发生的原因。这是因为部分它没有被赋予资源属性。我用dump(resource)和事实证明这是一个用户模式/对象,所以我说了下列:

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

,并添加以下到我的家庭控制器指数法:这之后,我得到

def index 
    @user = User.new 
end 

然而resource_name错误,结果只是:user,如果我设置,那么我得到一个问题,因为devise_mapping.rememberable?,我不知道如何提供。

我想正确地做到这一点,所以我想避免凌乱和不合逻辑的方法,我开始。

回答

17

在回答这个问题请看:Devise form within a different controller

您正在尝试与您的家庭控制器呈现形式依赖于设计定义不是来自非设计控制器访问的助手。

添加必要的助手到您home_helper.rb应该解决您的问题:

def resource_name 
:user 
end 

def resource 
@resource ||= User.new 
end 

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

我使用的设计3.5.1,我不得不添加resource_class的,以及获得登录表单上的其他工作控制器。

我将它添加到application_helper.rb,因此它适用于我所有的控制器。

def resource_name 
    :user 
end 

def resource 
    @resource ||= User.new 
end 

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

def resource_class 
    devise_mapping.to 
end 
相关问题