在Rails(模型或帮助器)中创建“链接”方法的最佳方法?

时间:2010-12-29 19:40:35

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

我对这个话题做了很多研究,似乎有些争议,所以我想得到你的意见。这是我的基本情况 - 我有一个用户模型:

class User < ActiveRecord::Base
  # User consists of first_name, last_name, and other fields
  has_one :profile # 1-1 mapping between User and Profile
                   # Profile is a nested resource of User

  # this is the method up for debate:
  # this obviously doesn't work unless I include
  # the necessary modules in this class
  def link(*args)
    link_to self.first_name, users_profile_path(self), args
  end
end

我对这种行为的推理是,在我看来,我想做的事情如下:

<%= @user.link %>

而不是:

<%= link_to @user.name, users_profile_path(@user) ... %>

每一次。在许多不同的视图中,此链接将被使用数千次。我想集中这个“方法”,这样当我需要做出改变时,我可以做一次。

然而,这种做法绝对违反了MVC架构。其他人建议使用帮手:

module UsersHelper
  def profile_link(user, *args)
    link_to user.name, users_profile_path(user), args
  end
end

现在,我必须将用户包装在方法中,而不是将其作为方法ON用户调用:

<%= profile_link(@user) %>

在我看来,这比后一个例子更丑。

所以我的问题是 - 哪个更好?或者有没有办法实现这一点,我完全没有意识到?

3 个答案:

答案 0 :(得分:3)

Rails就是按惯例编码。正如您所指出的,使用模型中的方法会破坏MVC的约定。除非有令人信服的理由这样做,否则最好继续使用流程,并使用辅助方法。

一个实际问题是测试:你会发现测试辅助方法比模型方法更容易。帮助程序测试将包括link_tousers_profile_path方法 - 模型测试不会。

最后,想想其他开发人员阅读您的代码。他们希望在哪里找到这种方法?如果您遵循MVC,您将使他们的生活更轻松。

答案 1 :(得分:1)

使用帮助程序。因为这是一个创建视图对象(锚标记)的方法,所以最好将它放在辅助模块中。

答案 2 :(得分:0)