2013-09-21 2 views
0

Я использую 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 в представлении и контроллерах правильно?

ответ

1

На самом деле мне не нравится ваш контроллер, потому что он смешивает логику, которая должна принадлежать представлению, а методы render_blah делают вещи излишне сложными.

Я предпочитаю этот стиль:

# ArticlesController 
def index 
    @articles = ... 
end 

def show 
    @article = ... 
end 

# views/articles/index.html.erb 
<% @articles.each do |article| %> 
    <%= render partial: 'article', locals: {article: article} 
<% end %> 

# views/articles/show.html.erb 
<%= render partial: 'article', locals: {article: @article} 

# views/articles/_article.html.erb 
<%= article.title %> 
<%= article.body %> 
# blah blah 

тот же эффект. Код DRYer. Чистая логика. Никаких помощников не нужно.

+0

Частичные шаблоны, которые я упомянул в вопросе, используются все больше и больше в моем приложении, и поэтому я извлек связанный код рендеринга в вспомогательных методах, чтобы не повторять весь оператор «render partial: ...» и сохранять вещи последовательны. Поскольку в действиях контроллера требуется точно такой же рендеринг (и я бы не повторил «render partial: ...»), тогда я хотел бы использовать тот же оператор даже там. * Примечание *: вопрос фокусируется на организации и доступности методов, а не на содержании файлов вида. – user502052

+0

Итак, как я могу сохранить логику, но СУХОЙ? – user502052

+0

Я обновил вопрос. Может быть, вещи более ясны, потому что я хотел бы сделать это ... – user502052

Смежные вопросы