2013-08-31 32 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

相關問題