Я использую Ruby on Rails 3.2.13, и я хотел бы DRY (Do not Reapeat Yourself) мой код в представлениях контроллеров e. То есть, в это время ...Как высушить код в контроллерах и помощниках для правильного отображения?
... в мой контроллер у меня есть:
# ArticlesController
def index
@articles = ...
...
case ...
when ... then render(:partial => 'partial_for_index', :object => @articles, :as => 'articles', ...)
else render :index
end
end
def show
@article = ...
...
case ...
when ... then render(:partial => 'partial_for_show', :object => @article, :as => 'article', ...)
else render :show
end
end
... в моем помощнике у меня есть:
# ArticlesHelper
def render_partial_for_index(articles, ...)
articles.map { |article| render_partial_for_show(article, ...) }.join('').html_safe
end
def render_partial_for_show(article, ...)
render(:partial => 'partial_for_show', :object => article, :as => 'article', ...)
end
... в моем просмотры у меня есть:
# articles/_partial_for_index.html.erb
<%= render_partial_for_index(@articles, ...) %>
# articles/_partial_for_show.html.erb
<%= article.title %> created at <%= article.created_at %>
для того, чтобы высушить мой код, я думал использовать вспомогательные методы непосредственно в контроллере (примечания: Я знаю, что этот подход ломает шаблон MVC, но это всего лишь пример того, что я стремлюсь сделать и должны сделать, чтобы этот вопрос более понятным), таким образом:
# ArticlesController
include ArticlesHelper
def index
@articles = ...
...
case ...
when ... then render_partial_for_index(@articles, ...)
else render :index
end
end
def show
@article = ...
...
case ...
when ... then render_partial_for_show(@article, ...)
else render :show
end
end
Таким образом, я могу удалить _partial_for_index.html.erb
просмотреть файл, так как он больше не используется, а код DRYed и соответствует на всей территории приложения. Однако, хотя контроллер show
работает, как и следовало ожидать, контроллер index
не работает с момента получения ошибки DoubleRenderError
, потому что несколько методов render
работают в вспомогательном методе render_partial_for_index
.
В нескольких словах я хотел бы использовать как менее возможные выражения для рендеринга. Как я могу/сушить свой код, чтобы достичь того, что я намереваюсь сделать? То есть, как я могу заставить его работать, сохраняя доступность методов render_partial_for_index
и render_partial_for_show
в представлении и контроллерах правильно?
Частичные шаблоны, которые я упомянул в вопросе, используются все больше и больше в моем приложении, и поэтому я извлек связанный код рендеринга в вспомогательных методах, чтобы не повторять весь оператор «render partial: ...» и сохранять вещи последовательны. Поскольку в действиях контроллера требуется точно такой же рендеринг (и я бы не повторил «render partial: ...»), тогда я хотел бы использовать тот же оператор даже там. * Примечание *: вопрос фокусируется на организации и доступности методов, а не на содержании файлов вида. – user502052
Итак, как я могу сохранить логику, но СУХОЙ? – user502052
Я обновил вопрос. Может быть, вещи более ясны, потому что я хотел бы сделать это ... – user502052