0

Ruby on Rails 3.2.13 を使用していますが、コントローラーとビューで自分のコードを DRY (Don't Repeat Yourself) したいと考えています。つまり、現時点で...

...私のコントローラーには次のものがあります:

# 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 %>

コードを DRY するために、コントローラーで直接ヘルパー メソッドを使用することを考えました (: このアプローチが 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ビュー ファイルはもう使用されておらず、コードはDRYされ、アプリケーション全体で一貫しているため、この方法でビュー ファイルを削除できます。ただし、コントローラーshowのアクションは期待どおりに機能しますが、ヘルパー メソッドで複数のメソッドが実行されるため、エラーが発生するため、コントローラーのindexアクションは機能しません。DoubleRenderErrorrenderrender_partial_for_index

簡単に言えば、レンダリングに使用するステートメントをできるだけ少なくしたいと考えています。作成しようとしているものに到達するためにコードをどのように乾燥させることができますか? つまり、ビューとコントローラーでのメソッドrender_partial_for_indexとメソッドの可用性を正しい方法で維持することによって、どのように機能させることができるでしょうか?render_partial_for_show

4

1 に答える 1

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コード。よりクリーンなロジック。ヘルパーは必要ありません。

于 2013-09-21T08:54:08.860 に答える