1

我正在开发一个表单,该表单应该允许用户更新一个称为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 %>

编辑为工作代码

4

3 回答 3

2

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

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

于 2013-08-31T03:21:18.070 回答
2

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

<%= 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
于 2013-08-31T04:11:37.607 回答
1

需要将条件拆分为 2 个语句:设置 session[:city] 的 unless 和检查是否传递了任何参数的 if。

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 %>
于 2013-09-01T23:00:11.877 回答