Stwórz formularz w innym kontrolerze

Używam klejnotu devise do procedur sign_in/sign_out.

Wygenerowałem pliki widoków z devise, używając rails g devise views

Widziałem, że jest devise / sessions / new.html.plik erb zawierający formularz dla sign_in.

Utworzyłem kolejny plik devise / sessions / _form.html.erb I did <%= render 'form' %> w ramach nowego.html.akta Erba, i to wyszło bardzo dobrze.

Chciałem dołączyć ten formularz z innego kontrolera. Tak więc w kontrolerze zwanym "głównym", (konkretnie w view page)"html.erb ' i included <%= render 'devise/sessions/form' %> file. Wydaje się, że włączenie działało dobrze, ale dostaję następujący błąd.
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: 

Wygląda na to, że formula_for (resource,...) część powoduje problem (który działa dobrze, jeśli jestem na oryginalnej stronie devise sign_in... Jak mogę rozwiązać ten problem w rails way?

Osobiście wolę używać funkcji "render" do dołączania formularza, niż pisać kody html w linii.

Czy muszę coś podać (zasób) w "głównym" kontrolerze?

Będę wdzięczny za pomoc. Dziękuję.
Author: user482594, 2010-11-02

5 answers

Jak mówi Andres, formularz wywołuje helpery, które są określone przez Devise, a więc nie są obecne, gdy uzyskujesz dostęp do formularza Devise z kontrolera nie-Devise.

Aby to obejść, musisz dodać następujące metody do klasy pomocniczej kontrolera, pod którym chcesz wyświetlić formularz. Alternatywnie możesz po prostu dodać je do pomocnika aplikacji, aby były dostępne w dowolnym miejscu.

  def resource_name
    :user
  end

  def resource
    @resource ||= User.new
  end

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

Źródło: http://pupeno.com/blog/show-a-devise-log-in-form-in-another-page/

 225
Author: Rupert Madden-Abbott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-18 00:48:30

Można spróbować również tego...sprawdź to pytanie .

Źródło

<%= form_for("user", :url => user_session_path) do |f| %>
  <%= f.text_field :email %>
  <%= f.password_field :password %>
  <%= f.check_box :remember_me %>
  <%= f.label :remember_me %>
  <%= f.submit 'Sign in' %>
  <%= link_to "Forgot your password?", new_password_path('user') %>
<% end %> 
 8
Author: jsp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:31

Utworzony formularz działa po renderowaniu z kontrolera Devise, ponieważ "zasób" jest zdefiniowany przez Devise. Spójrz na implementację Devise SessionsController - z tego co rozumiem, próbujesz odtworzyć" nową " akcję. Metoda "build_resource" jest prawdopodobnie tym, czego szukasz.

gem jest miejscem, z którego pochodzą obiekty "zasobów". Jeśli chcesz kopać głębiej, to jest to miejsce do szukania.

 4
Author: Andres Freyria,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-02 22:16:45

Otrzymywałem ten sam błąd undefined local variable or method "resource", który opisałeś z jednego z moich kontrolerów, ponieważ mojej podstawowej klasie kontrolerów brakowało następującego (rails-API ActionController::API było winne):

include ActionController::Helpers

W ten sposób metody pomocnicze Devise nie mogły zostać rozwiązane w widoku.

Aby Devise działał z Rails-API musiałem dołączyć:

class ApplicationController < ActionController::API

  include AbstractController::Rendering
  include AbstractController::Layouts
  include ActionController::MimeResponds
  include AbstractController::Translation
  include ActionController::ImplicitRender
  include ActionController::Helpers
 2
Author: Christopher Oezbek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-21 22:40:23

Aby doprecyzować akceptowaną odpowiedź, używamy tego helpera, aby zezwolić na różne rodzaje zasobów:

def resource_name
  @resource_name ||= if admin_controller?
    :admin_user
  else
    :user
  end
end

def resource
  @resource ||= resource_name.to_s.classify.constantize.new
end

def devise_mapping
  @devise_mapping ||= Devise.mappings[resource_name]
end

Gdzie admin_controller? jest coś, co mamy wcześniej w {[3] } do obsługi przekierowań logowania:

def admin_controller?
  !devise_controller? and request.path =~ /^\/admin/
end
helper_method :admin_controller?
 2
Author: bbozo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-16 08:06:04