2013-10-29 155 views
1

林定義的範圍重構我的代碼,並試圖按照慣例「瘦控制器,脂肪模型」 現在我想查詢移到模型:從視圖參數傳遞給模型

scope :scope1_department, where(sender_username: params[:username], recipient_username: params[:username]) 
scope :scope2_department, where(recipient_username: params[:username]) 
scope_department = scope1_department.merge(scope2_department).sort_by(&:created_at) 

在我的控制,我有:

@messages = Message.scope_department(params[:username]) 

現在我得到這個錯誤我的模型代碼:

undefined local variable or method `params' for #<Class:0x85d0b80> 

我也想在我的模型,以取代PARAMS [:用戶名]用簡單的用戶名,但後來我得到的錯誤:

undefined local variable or method `username' for #<Class:0x459fa50> 

有過類似的問題,而是你如何能本身我做了一些錯誤: Rails3 How can I use :params in named scope?

謝謝!

回答

3

您的模型中不能使用params變量。你可以做的是使用Lambda一個變量傳遞到範圍:

scope :scope1_department, ->(username){ where(sender_username: username, recipient_username: username)} 

在你的控制器:

@messages = Message.scope1_department(params[:username]) 
+0

不知怎的,在'scope:scope1_department, - >(username){where(sender_username:username,recipient_username:username)}''我得到錯誤'參數數量錯誤(0代表1)'我錯了什麼? –

+0

調用範圍時看起來像是錯誤。 – cortex

+0

我用'@messages = Message.scope_department(params [:username])調用它' –

1

方式傳遞參數給一個範圍:

class Message < ActiveRecord::Base 
    # a scope using a lambda 
    scope :scope2_department, lambda { |name| where(recipient_username: name) } 

    # same as above, ruby 1.9+ syntax 
    scope :scope3_department, ->(name) { where(recipient_username: name) } 

    # a class method 
    def self.scope4_department(username) 
    where(recipient_username: username) 
    end 
end 
+0

現在我嘗試了'scope:scope1_department,lambda {| username |在哪裏(sender_username:用戶名,recipient_username:用戶名)}'但不知何故,我得到的錯誤'錯誤數量的參數(0爲1)' –

+0

現在它的工作!但我還有一個問題!你寫了一個類方法,什麼時候我有兩個在其中定義的方法,我如何合併它們? –