在Rails中绕过Controller

时间:2011-07-15 22:13:27

标签: ruby-on-rails view model controller

我使用Rails 2.3.5并且我有一个模型,我们称之为Post。我使用命名范围在Post上应用不同种类的排序。例如,在Post模型中,我有可能按照其分数对帖子进行排名:

named_scope :order_by_acception_rate_desc,
Proc.new { |limit| { :limit => limit, :order => "acception_rate desc" } }

在Post Controller中我有:

def best
    @best_posts = Post.order_by_acception_rate_desc(10)
end

在视图中我只渲染这个集合@best_posts:

<%= render :partial => "post", :collection => @best_posts

目前我的应用程序正在这样工作,但实际上我不需要在Controller中使用“最佳”方法,我可以将其移动到Model Post中,如下所示:

def self.best
    self.order_by_acception_rate_desc(10)
end

然后在视图中我将渲染集合:

<%= render :partial => "post", :collection => Post.best

我不知道哪种方法更好,但是使用模型中的排名方法,我可以避免为每种排名方法创建路线。什么方法更好,有没有比这些更好的方法?

3 个答案:

答案 0 :(得分:1)

根据Rails惯例,逻辑应该分开,

  1. 控制器处理权限,身份验证/授权,分配实例/类变量
  2. 帮助程序处理html逻辑显示/隐藏给用户的内容
  3. 视图不应提供任何逻辑,权限检查。从设计师的角度思考
  4. 模型通过ORM处理数据收集/操作
  5. 我想请你试试:

    #helper
    def self.best(limit)
      all(:limit => limit, :order => "acception_rate desc")
    end
    
    #controller
    @best_posts = Post.best
    
    #view
    <%= render :partial => "post", :collection => @best_posts %>
    

答案 1 :(得分:0)

您不应绕过控制器并在视图中包含太多逻辑。

您可以保留一条路线并根据Post之一过滤params模型。

你在这里说得不够清楚,但你有大局。

答案 2 :(得分:0)

您可以只保留视图文件,它应该可以正常工作。