【问题标题】:Call a model method in a Controller在 Controller 中调用模型方法
【发布时间】:2012-06-23 18:33:13
【问题描述】:

我在这里遇到了一些困难,我无法在ProjectPage controller 中成功调用属于ProjectPage model 的方法。 p>

我的 ProjectPage 控制器中有:

def index
  @searches = Project.published.financed     
  @project_pages = form_search(params)
end

在我的ProjectPage 模型

def form_search(searches)
  searches = searches.where('amount > ?', params[:price_min]) if check_params(params[:price_min])
  @project_pages = ProjectPage.where(:project_id => searches.pluck(:'projects.id'))
end

但是,我无法成功调用form_search 方法

【问题讨论】:

    标签: ruby-on-rails methods model controller instantiation


    【解决方案1】:

    在模型中这样声明

    def self.form_search(searches)
      searches = searches.where('amount > ?', params[:price_min]) if check_params(params[:price_min])
      @project_pages = ProjectPage.where(:project_id => searches.pluck(:'projects.id'))
    end
    

    并从控制器调用

    @project_pages = ProjectPage.form_search(params)
    

    【讨论】:

      【解决方案2】:

      三件事:

      1.) 当你想创建一个不限于类对象的类范围方法时,你需要像这样定义它

      def self.method_name
        ..
      end
      

      而不是

      def method_name
        ...
      end
      

      2.) 这可以使用scopelambda 来完成,这些都是非常好的功能。像这样在模型中添加:

      scope :form_search, lambda{|q| where("amount > ?", q) }
      

      会让你打电话

      Project.form_search(params[:price_min])
      

      第二步是为ProjectPage 模型添加一个范围,这样所有东西都在它所属的地方!

      3.) 当您在 Controller 中调用 Class 方法时,您需要像这样指定 Model:

      Class.class_method
      

      【讨论】:

        【解决方案3】:

        要完成大卫的回答,你做错的两件事是:

        1) 当模型函数仅在模型本身中定义时,您正在从控制器调用模型函数。所以你确实需要打电话

        Project.form_search
        

        并用

        定义函数
        def self.form_search
        

        2) 您正在从模型中调用参数。在 MVC 架构中,模型对请求一无所知,因此这里没有定义 params。相反,您需要将变量传递给您的函数,就像您已经在做的那样......

        【讨论】:

        • 感谢self 是我所缺少的
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-18
        • 2019-10-08
        • 2011-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-14
        相关资源
        最近更新 更多