我对这个话题做了很多研究,似乎有些争议,所以我想得到你的意见。这是我的基本情况 - 我有一个用户模型:
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) %>
在我看来,这比后一个例子更丑。
所以我的问题是 - 哪个更好?或者有没有办法实现这一点,我完全没有意识到?
答案 0 :(得分:3)
Rails就是按惯例编码。正如您所指出的,使用模型中的方法会破坏MVC的约定。除非有令人信服的理由这样做,否则最好继续使用流程,并使用辅助方法。
一个实际问题是测试:你会发现测试辅助方法比模型方法更容易。帮助程序测试将包括link_to
和users_profile_path
方法 - 模型测试不会。
最后,想想其他开发人员阅读您的代码。他们希望在哪里找到这种方法?如果您遵循MVC,您将使他们的生活更轻松。
答案 1 :(得分:1)
使用帮助程序。因为这是一个创建视图对象(锚标记)的方法,所以最好将它放在辅助模块中。
答案 2 :(得分:0)
查看ActiveRecord的to_param方法:http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param