1. ホーム
  2. ruby-on-rails

[解決済み] 別コントローラーでフォームを工夫する

2022-07-08 08:48:27

質問

サインイン/サインアウトの手続きにdevise gemを使用しています。

deviseからviewsファイルを生成し rails g devise views

devise/sessions/new.html.erb ファイルがあり、サインイン用のフォームが含まれているのがわかりました。

私は別のファイルdevise/sessions/_form.html.erbを作成し、以下を実行しました。 <%= render 'form' %> を新しい.html.erbファイルの中で行い、それは非常にうまくいきました。

さて、私はこのフォームを別のコントローラから取り込みたかったのです。そこで、'main' というコントローラ (具体的にはビューページ内) 'mains/index.html.erb' で、次のように記述しました。 <%= render 'devise/sessions/form' %> というファイルを作成しました。インクルードはうまくいったようなのですが、次のようなエラーが発生します。

NameError in Mains#index

Showing /home/administrator/Ruby/site_v4_ruby/app/views/devise/sessions/_form.html.erb where line #1 raised:

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

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

form_for(resource,...)の部分が問題を引き起こしているようです(元のdeviseのサインインページであれば問題なく動作するのですが...)。この問題を解決するには、どのようにレールを敷けばよいのでしょうか?

個人的にはインラインでhtmlコードを書くよりも、'render'関数を使ってフォームをインクルードする方が好きなんです。

main'コントローラの中で何か(リソース)を指定する必要があるのでしょうか?

ご教授の程、宜しくお願い致します。よろしくお願いいたします。

どのように解決するのですか?

Andresが言うように、フォームはDeviseによって指定されたヘルパーを呼び出すので、Devise以外のコントローラからDeviseフォームにアクセスしたときには存在しないのです。

これを回避するためには、フォームを表示したいコントローラのヘルパークラスに以下のメソッドを追加する必要があります。あるいは、アプリケーションヘルパーに追加するだけで、どこでも利用できるようになります。

  def resource_name
    :user
  end

  def resource
    @resource ||= User.new
  end

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

出典 http://pupeno.com/blog/show-a-devise-log-in-form-in-another-page/