【问题标题】:Bypassing Controller in Rails在 Rails 中绕过控制器
【发布时间】:2011-07-15 22:13:26
【问题描述】:

我使用的是 Rails 2.3.5,我有一个模型,我们称之为 Post。我使用命名范围在 Post 上应用不同种类的类型。例如,在 Post 模型中,我可以根据分数对帖子进行排名:

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

在 Post 控制器中我有:

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

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

【问题讨论】:

    标签: ruby-on-rails view model controller


    【解决方案1】:

    根据 Rails 约定,逻辑应该是分开的,

    1. 控制器处理权限、身份验证/授权、分配实例/类变量
    2. 助手处理 html 逻辑向用户显示/隐藏什么
    3. 视图不应提供任何逻辑、权限检查。站在设计师的角度思考
    4. 模型通过 ORM 处理数据收集/操作

    我想请你试试:

    #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 %>
    

    【讨论】:

      【解决方案2】:

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

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

      你在这里说得不够清楚,无法更清楚地回答,但你有大局。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-11
          • 1970-01-01
          • 1970-01-01
          • 2018-04-18
          • 1970-01-01
          相关资源
          最近更新 更多