2013-08-31 36 views
0

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

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

编辑,以工作代码

回答

0

需要被分成2条语句的条件:一,除非设置会话[:城市]和如果来检查是否正在传递的任何PARAMS 。

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

这不会在生产工作一样,如果有多个工作进程,以服务请求(麒麟或乘客)的环境。每个进程都有自己的记忆。如果在由一个工作进程处理的请求期间更改该值,则其他进程将不具有更新的值。

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

+0

如果我换成'会议所有'@ city'实例[:城市]'会在生产环境中的工作?我能否通过用户提交的表单更新会话变量? – BHOLT

+1

否。将它作为参数传递给控制器​​并在控制器中设置会话 – usha

+0

这使得我的表单可以在单个页面上工作,但只要我离开,它就会丢失值。有什么我失踪的会话变量,所以它贯穿整个网站? – BHOLT

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 
+0

嗯。当我删除了except语句时,我得到了使用你的代码工作的'set_city'方法,所以逻辑是session [:city]等于用户的参数或请求的位置。问题是,当传递参数时,我仍然需要更新会话[:city]的表单。它似乎并未将更新存储为多个页面。 – BHOLT

+0

我很困惑你怎么得到request.location.city。可能当你不提交表单时,它会被设置为零。request.location.city – techvineet

+0

啊。 if/else/unless语句重新分配变量。所以我需要写一些默认情况下会获得'request.location'的东西,并且如果输入'params [:city]',则覆盖'session [:city]'。 – BHOLT

相关问题