#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’