【问题标题】:Pass a parameter from view to a scope defined in the model将参数从视图传递到模型中定义的范围
【发布时间】:2013-10-29 19:38:23
【问题描述】:

我正在重构我的代码并尝试遵循约定“瘦控制器,胖模型” 现在我尝试将 Query 移动到模型中:

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[:username] 替换为简单的用户名,但随后出现错误:

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

有一个类似的问题,但是你怎么能发现我做错了什么: Rails3 How can I use :params in named scope?

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4


    【解决方案1】:

    您不能在模型中使用params 变量。您可以做的是使用 lambda 将变量传递给作用域:

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

    在您的控制器中:

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

    【讨论】:

    • 不知何故在scope :scope1_department, -&gt;(username){where(sender_username: username, recipient_username: username)} 我得到了错误wrong number of arguments (0 for 1) 我做错了什么?
    • 我用@messages = Message.scope_department(params[:username])调用它
    【解决方案2】:

    将参数传递给作用域的方法:

    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
    

    【讨论】:

    • 现在我尝试了scope :scope1_department, lambda { |username| where(sender_username: username, recipient_username: username)} 但不知何故我得到了错误wrong number of arguments (0 for 1)
    • 现在可以了!但我还有一个问题!你写了一个类方法,当我有两个在其中定义的地方时,我该如何合并它们?
    猜你喜欢
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多