Лучший способ создать метод ссылки в Rails (модель или помощник)? - PullRequest
1 голос
/ 29 декабря 2010

Я провел много исследований по этой теме, и, похоже, возник спор, поэтому я хотел узнать ваше мнение.Вот моя базовая ситуация - у меня есть модель User:

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

Теперь я должен обернуть пользователя в метод вместо вызова его как метода для пользователя:

<%= profile_link(@user) %>

Что, на мой взгляд,, уродливее, чем последний пример.

Так что мой вопрос - что лучше ??Или есть способ сделать это, о чем я совершенно не знаю?

Ответы [ 3 ]

3 голосов
/ 29 декабря 2010

Rails - все о кодировании по соглашению.Как вы указали, использование метода в модели нарушает соглашения MVC.Если нет веских причин для этого, вам лучше идти по течению и использовать вспомогательный подход.

Одной практической проблемой является тестирование: вам будет проще тестировать вспомогательный метод, чеммодельный метод.Вспомогательные тесты будут включать методы link_to и users_profile_path для вас - тесты моделей не будут.

Наконец, подумайте о других разработчиках, читающих ваш код.Где они ожидают найти этот метод?Если вы будете следовать MVC, вы сделаете их жизнь проще.

1 голос
/ 29 декабря 2010

Используйте помощника. Поскольку это метод, который создает объект представления (тег привязки), лучше всего поместить его в вспомогательный модуль.

0 голосов
/ 29 декабря 2010

Взгляните на метод to_param ActiveRecord: http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...