2013-10-29 154 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

现在它的工作!但我还有一个问题!你写了一个类方法,什么时候我有两个在其中定义的方法,我如何合并它们? –