6

Devise と Rails3 を使い始めたばかりです。私は認証を停止し、機能しており、基本を理解しています。

現在、ホーム/フロントページを表すホームコントローラーには、登録=>サインアップにリンクするリンクと、ログイン/ログアウト=>サインイン/サインアウトに応じて変化するリンクの2つのリンクがあります。

ただし、ユーザーをログインページにリダイレクトしたくありません。代わりに、フロント ページにログイン フォームを表示したいと考えています。したがって、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?提供方法がわかりません。

私はこれを適切に行いたいので、私が始めた面倒で非論理的なアプローチは避けたい.

4

2 に答える 2

20

この質問に対する答えを見てみましょう:別のコントローラー内でフォームを考案する

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
于 2013-03-11T22:01:38.203 に答える
4

私は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
于 2015-07-30T12:59:46.213 に答える