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.
<%= 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ę.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/
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 .
<%= 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 %>
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.
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
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?
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