我想在我的after_sign_in_path_for
函数中返回的路径中添加参数。
当用户未经过身份验证并提交表单时,我会存储params,我的网站会将他重定向到登录表单。
def create
if current_user.nil?
session[:form_data] = params
redirect_to new_user_registration_path
else
# here I handle form params
end
end
然后用户登录,这是我的after_sign_in_path_for
功能。
def after_sign_in_path_for(resource)
if session[:form_data].present?
'/transactions#create'
else
session[:previous_url] || root_path
end
end
如果session[:form_data]
存在,我想将其重定向到#revate事务,但将session[:form_data]
内容作为参数。
我尝试使用redirect_to
,但它会抛出异常,因为调用after_sign_in_path_for
的设计函数也会调用redirect_to
。
有没有办法做到这一点?
答案 0 :(得分:0)
这里的问题是你应该 - 重定向是GET
个请求。您的创建操作应仅响应POST
请求,因为GET
请求存储在浏览器历史记录中,可能会无意中重复。
您可以做的是重定向到transactions#new
并使用参数预先填写表单:
def new
@transaction = Transaction.new(new_transaction_params)
end
def new_transaction_params
params.fetch(:transaction, {})
.permit(:a, :b, :c)
end
def after_sign_in_path_for(resource)
if session[:form_data].present?
new_transaction_path(query: session[:form_data])
else
session[:previous_url] || root_path
end
end
但是如果您已经在会话中保存了表单数据,则无需通过参数传递它。实际上,在查询字符串中发送参数的安全性稍差。
这假定您已使用以下方式设置路线:
resources :transactions