4

我在我的應用程序中使用了一個全局變量來傳遞信息。但是我遇到了一個問題,並且感謝大家在這裏建議我將這些數據存儲在數據庫會話中。如何將會話變量傳遞給RoR中的模型?

我試過了,但是我發現我無法訪問模型中的會話變量。我搜索了一下,知道這是模型的正常行爲,RoR不會將會話變量傳遞給模型。

所以,我想用的驗證和會話變量也控制器....

  1. 如何通過 會話變量進入模型的價值?或

  2. 是否有其他方法用於我的 用例?我需要一個存儲 值的變量,這是所有 MVC中都需要的值,並且在不同的併發用戶之間應該是獨立的 。

謝謝大家。 :)

+0

嗨siulamvictor, 你能詳細說明你的問題,你想做什麼。因爲通常你不需要訪問模型的會話,即使你這樣做也可能有另一種方式做它 歡呼聲, sameera – sameera207 2010-06-10 06:27:47

+0

嗨sameera。這實際上是一面旗幟。我有一個需要處理很多視圖的模型,但不同的視圖在這個模型中需要不同的驗證規則。我想爲這種控件使用一個變量。 – 2010-06-10 07:06:48

回答

6

如果我理解正確,會話變量將改變驗證模型的方式。我相信正確的解決方案如下:

class Blog < ActiveRecord::Base 
    attr_accessor :validate_title 

    validate_presence_of :title, :if => :validate_title 
end 

class BlogsController < ApplicationController 
    def new 
    @blog = Blog.new 
    @blog.validate_title = session[:validate_title] 
    end 
end 

該代碼還沒有testet,但這就是主意。 if參數可以是方法的名稱,你可以在那裏做任何你想做的事情。如果你願意,你可以有各種驗證模式。例如:

class Blog < ActiveRecord::Base 
    attr_accessor :validation_mode 

    validate_presence_of :title, :if => :validate_title 

    def validate_title 
    validation_mode == "full" or validation_mode == "only_title" 
    end 
end 

class BlogsController < ApplicationController 
    def new 
    @blog = Blog.new 
    @blog.validate_mode = session[:validate_mode] 
    end 
end 

欲瞭解更多信息,請閱讀the guide on validation

+0

非常感謝這位朋友〜它對我很好! – 2010-06-11 03:34:21

1

這樣做的最佳方法是創建一個帶參數的方法並通過session as an argument

FRO例如

class User < ActiveRecord::Base 

    def self.some_method(some_arg) 
    User.find(some_arg) 
    end 

end 

從控制器

User.some_method(session[:user_id]) 
+0

感謝哥們。但我需要驗證中的會話變量。你有什麼建議嗎? – 2010-06-10 05:10:35

1

模型是對數據庫的接口。它們可以在沒有會話的情況下使用(例如從IRB)。允許模型與會話交談會違反MVC。你能否擴展你的問題,提供更多關於你想要做什麼的信息?最有可能有更好的方法來做到這一點。

+0

嗨zaius。我需要這個,因爲我有一個根據不同情況在控制器中被更改的標誌,並且模型將需要這個標誌來選擇正確的驗證規則。你有什麼建議嗎?謝謝。 :) – 2010-06-10 07:10:25

2

您是否需要將會話變量作爲模型的一部分,或者只是作爲標誌來確定要執行的操作?

如果前者不需要知道參數來自何處,只需將該變量作爲參數傳遞給您的方法中的某個調用即可。例如:

@user = User.new(params[:user].merge(:some_attribute => session[:some_key])

,只是添加驗證像往常一樣在模型中。

如果您需要控制執行的某些流程,正如您所提到的,對於不同的用戶應該是不同的,您可能需要在控制器中使用實例變量。喜歡的東西

class SomeController 
    before_filter :set_some_session_variable 

    def set_some_session_variable 
    @some_variable = session[:some_key] 
    end 
end 

您可以在您的視圖直接使用session[:some_key],但最好將其設置在一個實例變量來代替。

+0

嗨丘巴斯。感謝您的回覆。是的,這是一面旗幟。我會嘗試你建議的解決方案。 – 2010-06-10 07:09:03

相關問題