Rails 6, позволяет пользователю перейти на ожидаемую страницу после аутентификации

#ruby-on-rails #ruby #authentication #devise #ruby-on-rails-6

#ruby-on-rails #ruby #аутентификация #разработать #ruby-on-rails-6

Вопрос:

Когда пользователь входит в систему, Devise переходит к new_car_path в соответствии с методом after_sign_in_path_for() . Однако бывают ситуации, когда пользователь попытается перейти на определенную страницу, которая должна быть аутентифицирована.

Мой пример, пользователь, вышедший из системы, переходит непосредственно к «domain.com/compliance-form «, эта страница требует, чтобы пользователь прошел аутентификацию, прежде чем попасть на нее, поэтому, как и ожидалось, она перенаправляет на форму входа. Когда пользователь входит в систему, он переводит их на путь «after_sign_in_path_for», который в этом случае является «new_car_path».

Однако, поскольку пользователь точно знает страницу, на которую он хочет перейти, я хочу, чтобы они перешли к «compliance_form_path» «domain.com/compliance-form «.

Как мне это сделать?

   def after_sign_in_path_for(_resource=nil)
    new_car_path
  end
 

Если я добавлю stored_location_for(resource) в качестве пользователя11350468 рекомендуется:

 def after_sign_in_path_for(resource = nil)
  stored_location_for(resource) || new_car_path
end
 

Я получаю следующую ошибку,

NoMethodError в SessionsController#создать неопределенный метод `user_url’ для #SessionsController: 0x00007fc9f9bd1148 Вы имели в виду? search_url

Затем добавлено:

 class ApplicationController < ActionController::Base
  before_action :store_user_location!, if: :storable_location?
  
  def storable_location?
    request.get? amp;amp; is_navigational_format? amp;amp; !devise_controller? amp;amp; !request.xhr? 
  end

  def store_user_location!
    store_location_for(:user, request.fullpath)
  end
end
 

Даже после добавления перед действием в контроллере я получаю ту же ошибку, вот журналы..

 Started GET "/compliance_form for 127.0.0.1 at 2020-12-17 11:26:14 -0600
Processing by ComplianceController#new as HTML
Completed 401 Unauthorized in 4ms (ActiveRecord: 0.0ms | Allocations: 411)

Started GET "/users/sign_in" for 127.0.0.1 at 2020-12-17 11:26:14 -0600
Processing by SessionsController#new as HTML
  Rendering devise/sessions/new.html.erb within layouts/devise
  Rendered devise/sessions/new.html.erb within layouts/devise (Duration: 20.3ms | Allocations: 9174)
  Rendered layouts/_head.html.erb (Duration: 361.5ms | Allocations: 235189)
  Rendered layouts/_devise_navbar.html.erb (Duration: 3.7ms | Allocations: 901)
  Rendered layouts/_footer.html.erb (Duration: 0.1ms | Allocations: 5)
Completed 200 OK in 399ms (Views: 395.8ms | ActiveRecord: 0.0ms | Allocations: 249472)

Started POST "/users/sign_in" for 127.0.0.1 at 2020-12-17 11:26:21 -0600
Processing by SessionsController#create as HTML
  Parameters: {"authenticity_token"=>"IDqVSy1swedds22AEqMEzQQnamz7I gysdfbNlPPhsRTMJGZkWCgWFYq1vg/3Af2Af5xjchnzdfgoH6m7wHXEA==", "user"=>{"email"=>"name@domain.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Continue"}
  User Load (1.8ms)  SELECT "users".* FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "name@domain.com"], ["LIMIT", 1]]
  ↳ app/controllers/sessions_controller.rb:6:in `create'
  User Load (0.9ms)  SELECT "users".* FROM "users" WHERE "users"."email" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["email", "name@domain.com"], ["LIMIT", 1]]
  ↳ app/controllers/sessions_controller.rb:11:in `create'
   (0.6ms)  BEGIN
  ↳ app/controllers/sessions_controller.rb:11:in `create'
  User Update (1.0ms)  UPDATE "users" SET "current_sign_in_at" = $1, "last_sign_in_at" = $2, "sign_in_count" = $3, "updated_at" = $4 WHERE "users"."id" = $5  [["current_sign_in_at", "2020-12-17 17:26:21.278696"], ["last_sign_in_at", "2020-12-17 17:24:43.660819"], ["sign_in_count", 31], ["updated_at", "2020-12-17 17:26:21.279770"], ["id", 2]]
  ↳ app/controllers/sessions_controller.rb:11:in `create'
   (4.6ms)  COMMIT
  ↳ app/controllers/sessions_controller.rb:11:in `create'
Redirected to 
Completed 500 Internal Server Error in 610ms (ActiveRecord: 9.9ms | Allocations: 188187)
NoMethodError (undefined method `user_url' for #<SessionsController:0x00007fae28d6a438>
Did you mean?  search_url):
  
app/controllers/sessions_controller.rb:11:in `create'
 

Обновить:

Мой синтаксис был немного не в порядке, я должен был опубликовать точный код (извлеченный урок):

   def after_sign_in_path_for(_resource=nil)
    return stored_location_for(resource) if stored_location_for(resource).present?
    return car_index_path if current_user.car?
    new_car_path
  end
 

Что происходит, когда stored_location_for(resource) вызывается, оно становится nil , и поэтому If оператор возвращается true , но возвращается значение stored_location_for(resource) nil .

Следовательно, вызывает ошибку. Решение Stored_location_for(), приведенное ниже, отлично работает!

Комментарии:

1. Это сводило меня с ума, пока я не наткнулся на ваш комментарий. В моем случае проблема заключалась в том, что у меня был вызов журнала отладки stored_location_for(resource) , который уничтожил переменную сеанса до его фактического вызова. Как только я удалил это, это сработало отлично.

Ответ №1:

Попробуйте выполнить следующее с помощью помощника stored_location_for

Возвращает и удаляет (если это формат навигации) URL-адрес, сохраненный в сеансе для данной области. Полезно для перенаправления после регистрации:

Согласно the devise wiki, пожалуйста, добавьте приведенное ниже before_action в свой application_controller:

 class ApplicationController < ActionController::Base
  before_action :store_user_location!, if: :storable_location?
  
  def storable_location?
    request.get? amp;amp; is_navigational_format? amp;amp; !devise_controller? amp;amp; !request.xhr? 
  end

  def store_user_location!
    store_location_for(:user, request.fullpath)
  end
end
 

А затем в after_sign_in_path_for:

 def after_sign_in_path_for(resource = nil)
  stored_location_for(resource) || new_car_path
end
 

Комментарии:

1. Я приветствую помощь, я получаю сообщение об ошибке, NoMethodError в SessionsController#создать неопределенный метод `user_url’