/ / Rails & Devise: Override SessionsController - ruby-on-rails, ruby-on-rails-3, devise

Railsy i Devise: Override SessionsController - ruby-on-rails, ruby-on-rails-3, devise

Próbuję ustawić formularz logowania na mojej stronie głównej, udało mi się to zrobić, postępując zgodnie z instrukcjami Wiki

Z wyjątkiem, jeśli informacje logowania są nieprawidłowe, /devise/session/new.html.erb jest renderowany. Nie chcę tego. Chcę, aby mój użytkownik został przekierowany do root_url Z błędy w wiadomości błyskawicznej.

Byłem w stanie przesłonić registrations_controller.rb dla innej funkcji, ale zastąp ją sessions_controller.rb sprawia mi wiele problemów.

Co mam zmienić, aby robić to, co chcę? Nadal chcę, aby użytkownik został przekierowany after_sign_in_path jeśli logowanie poszło dobrze. Pierwotny kontroler to tutaj

Do tej pory wiem, że muszę to zrobić w moim routes.rb

devise_for :users, :controllers => { :registrations => "registrations", :sessions => "sessions" }

I też ustawiłem controller/sessions_controller.rb

class SessionsController < Devise::SessionsController

# GET /resource/sign_in
def new
resource = build_resource
clean_up_passwords(resource)
respond_with_navigational(resource, stub_options(resource)){ render_with_scope :new }
end

end

Mam wrażenie, że muszę to zmienić render_with_scope :new ale jak? W tej wersji dostaję błąd undefined method "users_url" for #<SessionsController:0x5072c88>

Cóż, będę czekał na twoją cenną pomoc

PS: To stanowisko bardzo mi pomógł w obsłudze błędów w abonamencie. Może to pomoże w zarejestrowaniu błędów?

==== EDYCJA ====

Po pierwszej odpowiedzi, dodałem także initializers/devise.rb:

config.warden do |manager|
manager.failure_app = CustomFailure
end

Kiedy użytkownik nie jest zalogowany i próbuje uzyskać dostęp do "zastrzeżonego" obszaru, zostaje przekierowany do root_url ale gdy znak jest nieprawidłowy, teraz mam następujący błąd:

The action "devise/sessions#new" could not be found for Devise::SessionsController

(PS: usunąłem wszystko, co zrobiłem z kontrolerem sesji, a logowanie zakończyło się powodzeniem)

=== EDYCJA 2 ===

Podążając za tym Wiki przekierowanie działa idealnie ALE Nie mam żadnego powiadomienia o błędzie.

I wyświetlam komunikat ostrzegawczy / powiadomienie o tym, jeśli to zmieni cokolwiek

<% flash.each do |name, msg| %>
<% if msg.class == Array %>
<% msg.each do |message| %>
<%= content_tag :p, message, :id => "flash_#{name}" %>
<% end %>
<% else %>
<%= content_tag :p, msg, :id => "flash_#{name}" %>
<% end %>
<% end %>

=== OSTATECZNA AKTUALIZACJA ===

Przyjęta odpowiedź działa. Po prostu nie zapomnij wyświetlić flash alerts

Odpowiedzi:

15 dla odpowiedzi № 1

Musisz zastąpić niestandardową awarię wymyślić Class.

Dodaj tę niestandardową klasę niepowodzenia w lib / custom_failure.rb

class CustomFailure < Devise::FailureApp
def respond
if http_auth?
http_auth
elsif warden_options[:recall]
recall
else
redirect
end
end

def redirect
store_location!
flash[:alert] = i18n_message unless flash[:notice]
redirect_to "/"
end

def recall
env["PATH_INFO"] = attempted_path
flash.now[:alert] = i18n_message(:invalid)
self.response = recall_controller.action(warden_options[:recall]).call(env)
end

protected

def i18n_message(default = nil)
message = warden.message || warden_options[:message] || default || :unauthenticated

if message.is_a?(Symbol)
I18n.t(:"#{scope}.#{message}", :resource_name => scope,
:scope => "devise.failure", :default => [message, message.to_s])
else
message.to_s
end
end

def warden_options
env["warden.options"]
end

def warden
env["warden"]
end

def recall_controller
"#{params[:controller].camelize}Controller".constantize
end


def attempted_path
warden_options[:attempted_path]
end

def store_location!
session[:"#{scope}_return_to"] = attempted_path if request.get? && !http_auth?
end

def attempted_path
warden_options[:attempted_path]
end

def http_auth?
!Devise.navigational_formats.include?(request_format) || (request.xhr? && Devise.http_authenticatable_on_xhr)
end
end

Napisz to w pliku config / application.rb

config.autoload_paths += %W(#{config.root}/lib)

_________________Edytować __________________

Powiedziałeś, że "rejestracja idzie nie tak", oznacza to, że kontrola powinna być w registrations_controller create metoda. Coś tu musi być nie tak, chyba. Spróbuj dodać te trasy.

devise_for :users

devise_scope :user do
root :to => "devise/sessions#new"
get "sign_in", :to => "devise/sessions#new"
get "sign_out", :to => "devise/sessions#destroy"
get "sign_up", :to => "devise/registrations#new"
end

________________Edit 2 ________________

Dodaj to w views / devise / registrations / new.html.erb

<%= devise_error_messages! %>

3 dla odpowiedzi № 2

Jeśli napotkasz błąd undefined method "users_url" for #<SessionsController:0x5072c88> przy nadpisywaniu kontrolera sesja devise można podać nazwę ścieżki, jak poniżej. Ważnym dodatkiem, który przegapiłeś jest , :as => :users.

  devise_scope :user do
root :to => "devise/sessions#new", :as => :users
get "sign_in", :to => "devise/sessions#new"
get "sign_out", :to => "devise/sessions#destroy"
get "sign_up", :to => "devise/registrations#new"
end

Powyższa nazwa trasy może kolidować z istniejącymi lub przyszłymi trasami. Jako alternatywę stwierdziłem, że ta konfiguracja działa dobrze:

  devise_for :users,
:path_names  => { :sign_out => "logout",
:sign_in  => "login",
:sign_up  => "register" },
:controllers => { :sessions => "users/sessions" } do

# Sessions
post "/login"         => "users/sessions#create",       :as => :user_session
get  "/login"         => "users/sessions#new",          :as => :new_user_session
get  "/logout"        => "users/sessions#destroy",      :as => :destroy_user_session

# Passwords
post "/password"      => "devise/passwords#create",     :as => :user_password
put  "/password"      => "devise/passwords#update"
get  "/password/new"  => "devise/passwords#new",        :as => :new_user_password
get  "/password/edit" => "devise/passwords#edit",       :as => :edit_user_password

# Registrations
post   "/register"    => "devise/registrations#create", :as => :user_registration
get    "/register"    => "devise/registrations#new",    :as => :new_user_registration
get    "/account"     => "devise/registrations#edit",   :as => :edit_user_registration
put    "/account"     => "devise/registrations#update"
delete "/account"     => "devise/registrations#destroy"

end

0 dla odpowiedzi № 3

Wskazówka do debugowania próba usunięcia jakiegokolwiek rekordu (użytkownik byłby spójny); jeśli przejdziesz do akcji pokazowej, nie jest to sprawa konfiguracyjna. W tym przypadku wykonaj następujące czynności (inne odpowiedzi znajdują się tutaj)

Nie widzę, gdzie w widoku wywołuje się główny plik javascript.

Kilka razy uderzyłem się w to, używając różnych konfiguracji javascript w różnych układach.

<%= javascript_include_tag "my-differntly-fangled-application" %>

musi zawierać odpowiedni plik manifestu

//= require jquery
//= require jquery_ujs