【问题标题】:Saving URL params in a session (rails)在会话中保存 URL 参数 (rails)
【发布时间】:2026-02-07 05:25:01
【问题描述】:

我正在尝试将每个页面的 url 参数保存到会话中,因此如果有人在离开其登录页面后填写表单,它会保留广告系列 ID。我已经设法让它逐页工作,所以如果他们用参数登陆表单,它会保留它,但如果他们导航离开显然不会。我目前有:

控制器:

def campaign
  if params[:campaign]!= nil
    session[:campaign] = params[:campaign]
  end
end

def post

  rif = Registerinterest.find(:all, :conditions => ["reference = ?", session[:campaign]])

  if rif.count == 0
    post["Campaign_ID"] = "701D00000001111"
  else
    post["Campaign_ID"] = rif.first.campaign_id
  end
end

当我使用参数时它有效,但不是会话,所以我假设我没有正确保存它?

【问题讨论】:

    标签: ruby-on-rails url session params


    【解决方案1】:

    您可以在 controllers/application_controller.rb 中添加一个前置过滤器

    class ApplicationController < ActionController::Base
      before_filter persist_campaign_session
    
      def persist_campaign_session
        session[:campaign] ||= params[:campaign]
      end
    end
    

    如果设置了session[:campaign],它将被使用,否则params[:campaign]将被使用。你应该实施 session[:campaign] 的重置在一个好地方。

    【讨论】:

    • 我需要它来将 params[:campaign] 设置为 session[:campaign] 以便它可以在任何地方使用
    • 每次请求都会调用 ApplicationController,因为所有控制器都继承自它。您在下面所做的是不应该放在视图文件中的逻辑。按照我的建议尝试一下,你就在 Rails 轨道上;-)
    【解决方案2】:

    我把它放在我的应用程序布局中:

    - if params[:campaign] != nil || params[:campaign] != ""
      - session[:campaign] == params[:campaign] 
    

    然后让控制器正常工作:

    def post
    
      rif = Registerinterest.find(:all, :conditions => ["reference = ?", session[:campaign]])
    
      if rif.count == 0
        post["Campaign_ID"] = "701D00000001111"
      else
        post["Campaign_ID"] = rif.first.campaign_id
      end
    end
    

    【讨论】:

    • 我认为@awenkhh 的建议更像是 Rails 方式,但这是您的选择。