是否可以使用Rails中的表单更新会话变量?

时间:2013-08-31 03:11:52

标签: html ruby-on-rails

我正在处理一个表单,该表单应该允许用户更新跟踪其位置的名为session[:city]的会话变量。该变量不需要保存在数据库中,因为它是一次性的;它只需要在用户访问网站时存在。

session[:city]用于整个站点的几个地方,因此我在应用程序控制器中放置了以下方法:

class ApplicationController < ActionController::Base
  before_filter :set_city

  def set_city
    unless session[:city].present?
      session[:city] = request.location.city
    end
    if params[:city].present?
      session[:city] = params[:city]
    end
  end
end

该部分正常工作,我可以在整个网站中调用变量。

我遇到的问题是通过表单更新变量。我需要它做的唯一操作是更新变量,但它没有响应。我知道我在这里遗漏了一些东西,但在尝试了一堆东西后我有点难过。这是我目前的基本形式:

<%= form_tag do %>
  <%= text_field_tag :city, params[:city] %>
  <%= submit_tag %>
<% end %>

编辑工作代码

3 个答案:

答案 0 :(得分:2)

这在生产环境中不起作用,因为您有多个工作流程来处理请求(独角兽或乘客)。每个进程都有自己的内存。如果在由一个工作进程处理的请求期间更改了该值,则其他进程将不具有更新的值。

您应该使用会话来存储此信息。

答案 1 :(得分:1)

您可以尝试这样的事情: -

<%= form_tag do %>
  <%= text_field_tag :person, :city, :name => "city" %>
  <%= submit_tag %>
<% end %>

class ApplicationController < ActionController::Base
  before_filter :set_city

  def set_city
    unless session[:city].present?
      session[:city] = params[:city] || request.location.city
    end
  end
end

答案 2 :(得分:0)

条件需要分为2个语句:除非设置会话[:city],否则检查是否有任何参数被传递。

class ApplicationController < ActionController::Base
  before_filter :set_city

  def set_city
    unless session[:city].present?
      session[:city] = request.location.city
    end
    if params[:city].present?
      session[:city] = params[:city]
    end
  end
end

工作形式:

<%= form_tag root_path do %>
  <%= text_field_tag :city, params[:city], :placeholder => "#{session[:city]}: Change City" %>
<% end %>