Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 是否可以使用Rails中的表单更新会话变量?_Html_Ruby On Rails - Fatal编程技术网

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

Html 是否可以使用Rails中的表单更新会话变量?,html,ruby-on-rails,Html,Ruby On Rails,我正在开发一个表单,它应该允许用户更新一个名为session[:city]的会话变量,该变量跟踪他们的位置。该变量不需要保存在数据库中,因为它是一种一次性的;它只需要在用户在站点上时存在 session[:city]在整个站点的多个地方都使用,因此我在应用程序控制器中放置了以下方法: class ApplicationController < ActionController::Base before_filter :set_city def set_city unles

我正在开发一个表单,它应该允许用户更新一个名为
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
class ApplicationController
这部分工作正常,我能够在整个站点调用该变量

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

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


编辑为工作代码

这在类似生产的环境中不起作用,在这种环境中,您有多个工作进程来处理请求(unicorn或passenger)。每个进程都有自己的内存。如果在一个工作进程处理请求期间更改了该值,则其他进程将不会具有更新的值


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

这在类似生产的环境中不起作用,在这种环境中,您有多个工作进程来处理请求(unicorn或passenger)。每个进程都有自己的内存。如果在一个工作进程处理请求期间更改了该值,则其他进程将不会具有更新的值


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

您可以尝试以下方法:-

<%= 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

“城市”%>
类ApplicationController
您可以尝试以下方法:-

<%= 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

“城市”%>
类ApplicationController
需要将条件拆分为两条语句:一条除非用于设置会话[: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
class ApplicationController
以及工作形式:

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

“#{会话[:城市]}:更改城市”%>

需要将条件拆分为两条语句:一条除非用于设置会话[: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
class ApplicationController
以及工作形式:

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

“#{会话[:城市]}:更改城市”%>


如果我将所有
@city
实例替换为
会话[:city]
在生产环境中是否可行?我是否能够通过用户提交的表单更新会话变量?否。将其作为参数传递给控制器,并在控制器中设置会话,使我的表单在单个页面上工作,但一旦我离开,它就会丢失值。会话变量是否有我遗漏的东西,因此它会在整个站点上运行?当您在会话中输入一些值时,它将一直可用,直到会话结束。因此,您将能够访问所有页面中的变量。您可以将其作为会话[:city]阅读。当您要更改值时,请在控制器中更改它。如果我将所有
@city
实例替换为
会话[:city]
在生产环境中有效吗?我是否能够通过用户提交的表单更新会话变量?否。将其作为参数传递给控制器,并在控制器中设置会话,使我的表单在单个页面上工作,但一旦我离开,它就会丢失值。会话变量是否有我遗漏的东西,因此它会在整个站点上运行?当您在会话中输入一些值时,它将一直可用,直到会话结束。因此,您将能够访问所有页面中的变量。您可以将其作为会话[:city]阅读。如果要更改值,请在controller.Hmm中更改它。当我删除除非语句时,
set_city
方法使用您的代码工作,因此逻辑将是session[:city]等于用户的参数或请求的位置。问题是,当传入参数时,我仍然需要表单来更新会话[:city]。它似乎没有为多个页面存储更新。我很困惑您是如何获得request.location.city的。可能当您不提交表单时,request.location.cityAh会将其设置为nil。if/else/除非语句正在重新分配变量。因此,我需要编写一些东西来获取默认的
请求.location
,并覆盖
会话[:city]
if
params[:city]
已输入。request.location.city是RubyGeocoder提供的一种方法,通过IP地址获取位置。需要将条件拆分为两条语句:一条除非设置会话[:city],一条如果检查是否传递了任何参数。谢谢你的帮助!嗯。当我删除了unlike statem时,我用你的代码使用了
set\u city
方法