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