2011-01-29 39 views
1

我使用Rails 3的Ruby和我特林做一些像這樣在我模型文件是否可以在模型中使用'請求'方法?

if request.headers["CONTENT_LENGTH"] 
    ... 
end 

,但我得到這個錯誤:

NameError (undefined local variable or method `request' for #<User:0x00...>): 

那麼,有沒有可能在模型中使用'請求'方法? 如果是這樣,怎麼樣?

+0

如果您可以訪問模型中的請求,您仍然不應該這樣做。你試圖解決的實際問題是什麼?毫無疑問,有更好的方式來解決它在軌道上。 –

+0

我想在模型中使用CUSTOM驗證方法驗證文件上傳。另請參閱此:http://stackoverflow.com/questions/4837014/how-to-check-the-field-content-length-of-an-http-request-using-ruby-on-rails-3 – user502052

+0

@ user502052 :但爲什麼在用戶模型中呢? – tokland

回答

2

不,因爲請求僅在控制器和視圖代碼中可用。從設計角度來看,建議您在模型代碼中使用請求,但假設您希望針對您的用戶的特定實例執行某項​​操作,只需爲其創建一個方法:

class User 
    ... 
    def has_a_request?(request) 
    raise ArgumentError if(request.blank? || !request.respond_to(:headers)) 
    if(request.headers["CONTENT_LENGTH"] # Does it really have CONTENT_LENGTH btw? 
     puts "#{self.username} got a request with content length" 
     return true 
    else 
     puts "#{self.username} didn't get a request with content length" 
     return false 
    end 
    end 

,然後在申請其它地方:

User.has_a_request?(request) 
+0

我可能會解耦它,而不是發送整個請求(一個模型尋找請求是奇怪的),只發送任何方法真正需要檢查。但是OP的問題非常簡潔,不可能做到,所以這個答案是可以的。 – tokland

+0

同意 - 我不主張將請求代碼放入模型中... – stef

0

不好的應用程序設計中使用的方法請求對象,但如果你確實需要它,你可以這樣做:

class User 
    def a_method request 
    end 
end 

class UserController 
    def index 
    User.find(params[:user]).a_method request 
    end 
end 
0

防爆在您的控制器中傳遞請求對象中的相關數據,然後將它們傳遞給模型 - 可以通過在其實例上設置屬性或將它們作爲參數傳遞給方法調用。

相關問題