/ / रेल और डिवाइसेज: ओवरराइड सत्र नियंत्रक - रूबी-ऑन-रेल, रूबी-ऑन-रेल-3, डिवीज

रेल और देवता: ओवरराइड सत्र नियंत्रक - रूबी-ऑन-रेल, रूबी-ऑन-रेल -3, तैयार

मैं अपने होम पेज पर एक फॉर्म में साइन अप करने की कोशिश कर रहा हूं। मैं इसे पालन करके ऐसा करने में कामयाब रहा विकी

सिवाय, अगर लॉगिन इंफोस गलत हैं, तो /devise/session/new.html.erb प्रस्तुत किया जाता है। मुझे यह नहीं चाहिए। मैं चाहता हूं कि मेरे उपयोगकर्ता को रीडायरेक्ट किया जाए root_url साथ में एक फ्लैश संदेश में त्रुटियां।

मैं ओवरराइड करने में सक्षम था registrations_controller.rb एक और सुविधा के लिए लेकिन ओवरराइड sessions_controller.rb मुझे बहुत परेशानी देता है।

मुझे क्या लगता है कि मैं जो करना चाहता हूं उसे बदलने के लिए मुझे क्या लगता है? मैं अभी भी उपयोगकर्ता को रीडायरेक्ट करना चाहता हूं after_sign_in_path अगर साइन इन सही हो गया। मूल नियंत्रक है यहाँ

अब तक, मुझे पता है कि मुझे यह करना है routes.rb

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

और मैंने भी स्थापित किया 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

मुझे लगता है कि मुझे बदलना है render_with_scope :new पर कैसे? उस संस्करण के साथ, मुझे त्रुटि मिलती है undefined method "users_url" for #<SessionsController:0x5072c88>

खैर, मैं आपकी बहुमूल्य मदद की प्रतीक्षा करूंगा

पीएस: वह पद सदस्यता पर त्रुटियों को संभालने के लिए मुझे बहुत मदद मिली। शायद यह "त्रुटियों में साइन इन करने में मदद करेगा?

==== संपादित करें ====

1 उत्तर उत्तर सलाह के बाद, मैंने भी इसमें जोड़ा initializers/devise.rb:

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

जब उपयोगकर्ता लॉग नहीं होता है और "प्रतिबंधित" क्षेत्र तक पहुंचने का प्रयास करता है, तो उसे रीडायरेक्ट किया जाता है root_url लेकिन जब साइन इन गलत हो जाता है, तो अब मुझे निम्न त्रुटि है:

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

(पीएस: मैंने सत्र नियंत्रक के साथ किए गए सब कुछ हटा दिए और सफल होने पर लॉग इन काम किया)

=== संपादित करें 2 ===

इस से निर्देशित विकी पुनर्निर्देशन पूरी तरह से काम करता है परंतु मुझे कोई त्रुटि अधिसूचना नहीं है।

और मैं इसके साथ अलर्ट / नोटिस फ्लैश संदेश प्रदर्शित कर रहा हूं अगर वह कुछ भी बदलता है

<% 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 %>

=== अंतिम अपडेट ===

स्वीकृत उत्तर काम करता है। बस प्रदर्शित करने के लिए मत भूलना flash alerts

उत्तर:

उत्तर № 1 के लिए 15

आपको अपनी कस्टम विफलता तैयार कक्षा को ओवरराइड करना होगा।

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

इसे config / application.rb के अंतर्गत लिखें

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

_________________ __________________ संपादित करें

आपने कहा था कि "साइन अप गलत हो जाता है", इसका मतलब है कि नियंत्रण registrations_controller में होना चाहिए create तरीका। मुझे लगता है कि कुछ गलत होना चाहिए। इन मार्गों को जोड़ने का प्रयास करें।

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

________________ 2 ________________ संपादित करें

इसे दृश्य / devise / registrations / new.html.erb में जोड़ें

<%= devise_error_messages! %>

जवाब के लिए 3 № 2

यदि आप "त्रुटि में चल रहे हैं undefined method "users_url" for #<SessionsController:0x5072c88> जब डिवीजन सत्र नियंत्रक को ओवरराइड करते हैं तो आप नीचे जैसा पथ नाम प्रदान कर सकते हैं। आपके द्वारा याद किया गया महत्वपूर्ण जोड़ है , :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

उपर्युक्त मार्ग का नाम मौजूदा या भविष्य के मार्गों के साथ संघर्ष कर सकता है। एक विकल्प के रूप में, मैंने पाया है कि यह सेटअप अच्छी तरह से काम करता है:

  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 № 3

डिबगिंग संकेत किसी भी रिकॉर्ड को हटाने का प्रयास करें (एक उपयोगकर्ता सुसंगत होगा); यदि आप शो एक्शन पर जाते हैं, तो यह एक विन्यास विन्यास मामला नहीं है। इस मामले के लिए, साथ पालन करें (अन्य मामलों का उत्तर यहां दिया गया है)

मैं नहीं देख सकता कि आप रूट जावास्क्रिप्ट फ़ाइल को कहां देख रहे हैं।

अलग-अलग लेआउट में अलग-अलग जावास्क्रिप्ट सेट-अप का उपयोग करके मैंने कुछ बार इस पर अपने सिर को टक्कर लगी है। जो भी आपका हेडर पढ़ता है, कॉल

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

प्रासंगिक मेनिफेस्ट फ़ाइल में शामिल होने की आवश्यकता है

//= require jquery
//= require jquery_ujs