将参数添加到after_sign_in_path_for

时间:2016-01-26 09:34:15

标签: ruby-on-rails devise

我想在我的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

有没有办法做到这一点?

1 个答案:

答案 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