【问题标题】:Devise render sign => up/in form partials elsewhere in code在代码的其他地方设计渲染符号 => 向上/以局部形式呈现
【发布时间】:2013-02-27 05:02:35
【问题描述】:

我刚开始使用 Devise 和 Rails3。我已经完成了身份验证,并且正在工作并且了解基础知识。

到目前为止,在代表我的主页/首页的主页控制器中,我有两个链接,一个链接到 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 %>

并在我的 Home 控制器索引方法中添加了以下内容:

def index
   @user = User.new
end

但是在那之后我得到了资源名称错误,结果只是:user,如果我设置了它,那么我会因为devise_mapping.rememberable?而遇到问题,我不知道如何提供。

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 devise ruby-on-rails-3.2


    【解决方案1】:

    看看这个问题的答案:Devise form within a different controller

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

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

    def resource_name
    :user
    end
    
    def resource
    @resource ||= User.new
    end
    
    def devise_mapping
    @devise_mapping ||= Devise.mappings[:user]
    end
    

    【讨论】:

      【解决方案2】:

      我使用的是 Devise 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多