在sign_in和执行POST操作后设计重定向



我正在用Devise gem&轨道6.1。我在使用小型RSVP功能时遇到问题。

当非登录用户点击"登录"时;参加";按钮,它重定向用户登录,一旦完成,用户将重定向回上一页。但是用户必须再次点击";参加";按钮

我希望用户重定向回并完成创建操作(POST操作(

我设法很好地完成了重定向工作,但用户必须再次点击";参加";我不想要的按钮。我搜索了整个互联网,但没有一个解决方案奏效。我找到的秘密解决方案来自这个博客https://blog.justinthiele.com/retaining-form-data-through-a-login-process-a/我试着在我的应用程序上应用,但没有成功。

我认为after_sign_in_path_for方法中缺少一些内容。

如有任何帮助,我们将不胜感激。

更新!

调试后,我稍微改变了覆盖Devise的方式。我觉得我离解决方案很近了,但无法弄清楚我缺少了什么。

attendee_controller.rb

def create
if !current_user
# Store the data in the session so we can retrieve it after login
session[:attendee] = params
# Redirect the user to register/login
redirect_to user_session_path
else
@attendee = current_user.attendees.build({event_id: params[:id]})
respond_to do |format|
AttendeeMailer.with(event: @attendee).notify_event_creator.deliver_now
if @attendee.save
format.html { redirect_to @attendee.event, notice: "You have successfully registered for the event!" }
format.json { render :show, status: :created, location: @attendee }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @attendee.errors, status: :unprocessable_entity }
end
end
end
end 

app\controllers\users\sessions_controller.rb(user_session_path(

protected
def after_sign_in_path_for(resource_or_scope)
if session[:attendee].present?
new_attributes = session[:attendee]
previous_url = session[:previous_url] #defined in the show method from the events controller.
@attendee = current_user.attendees.create({event_id: new_attributes[:id]})
#clear session
session[:attendee] = nil
session[:previous_url] = nil

previous_url
else
#if there is not temp attendee in the session proceed as normal
super
end
end

events_controller.rb

def show 
session[:previous_url] = request.fullpath
end

routes.rb

devise_for :users, controllers: { sessions: "users/sessions" }
resources :events do
post :attendee, to: 'attendees#create', on: :member
post :unattend, to: 'attendees#destroy', on: :member
end

在视图中,Views\events\show.html.erb

<%= button_to 'Attend Now', attendee_event_path(@event), class:"btn btn-success btn-lg" %>

找到了解决方案!实际上有一个名为repost的gem,它可以帮助您重定向到POST操作。我在解决方案中实现了它。

这是我运用的全部技巧。登录后重定向,然后在登录成功时完成POST操作:

首先,我创建一个会话session[:previous_url],稍后用于重定向回此处。

def show
session[:previous_url] = request.fullpath #url for user to come back after signing in
...

attee_controller.rb:我们创建session[:attendee]

def create
if !current_user
session[:attendee] = true
redirect_to user_session_path
else
...

app\controllers\users\sessions_controller.rb(user_session_path(

protected
def after_sign_in_path_for(resource_or_scope)
if session[:attendee]
previous_url = session[:previous_url]
session[:previous_url] = nil #clear session
previous_url #going back to event page
else
super
end
end

有关after_sign_in_path_for方法的更多信息,请访问Devise How To Wiki。

previous_url将使我们从事件回到show视图。

以下是宝石的用武之地:

app\controllers\events_controller.rb

before_action :attendee?, only: :show
private
def attendee?
if session[:attendee]
session[:attendee] = nil
repost(attendee_event_path, options: {authenticity_token: :auto})
end
end

这是宝石模板:

repost('url' , params: {}, options: {})

以下是gem链接:https://github.com/vergilet/repost

最新更新