5

アプリケーションで AR ファインダーを DRY に保つことに問題があります。ユーザーが最初にブログを表示したときに、ブログに関連するすべてのページ、投稿、リンク、タグ、およびカテゴリを取得するブログ アプリケーションを作成しました。ブログ コントローラの show アクションの例を以下に示します。

def show
    #find blog by user name
    @user= User.find_by_login(params[:id])
    @blog= @user.blog
    @posts = Post.status("publish",@user).find(:all, :order => "created_at DESC")
    @tags = @user.tags
    @pages = Page.status("publish",@user).find(:all, :order => "created_at DESC")
    @links = @user.links.public_link.find(:all, :order => 'created_at DESC')
    @archives = @posts.group_by(&:month)
    @categories = @user.categories.group_by(&:name)
    session[:found_user]=@user.login
    render :layout=>false
  end

お分かりのように、コントローラーのさらに @tags などの同じインスタンス変数を呼び出す他のアクションがあるため、あまり DRY ではありません。

これをもっとDRYにするにはどうすればよいですか?ブログ モデルに移動しようとしましたが、コントローラーで @tags などのさまざまなインスタンス変数を呼び出す必要があります。

ブログが最初に呼び出されたときにこれらすべての変数を保存し、コントローラーとアクションで再利用する方法はありますか?

アドバイスありがとうございます。Rails 2.1を使用しています

4

1 に答える 1

3

私はどこかでブログを読んで、フィルタの前 (またはコントローラ メソッドであらゆる種類のデータをロードすること) を単純にヘルパー メソッドに置き換えました。このようなもの:

class BlogsController < ApplicationController
  def show
    session[:found_user]=@user.login
    render :layout=>false
  end

  helper_method :user, :blog, :posts, :tags, :pages, :links, :archives, :categories

  protected
  def user
    @user ||= User.find_by_login(params[:id])
  end

  def blog
    @blog ||= user.blog
  end

  def posts
    @posts ||= Post.status("publish", user).find(:all, :order => "created_at DESC")
  end

  def tags
    @tags ||= user.tags
  end

  def pages
    @pages ||= Page.status("publish", user).find(:all, :order => "created_at DESC")
  end

  def links
    @links ||= user.links.public_link.find(:all, :order => 'created_at DESC')
  end

  def archives
    @archives ||= posts.group_by(&:month)
  end

  def categories
    @categories ||= user.categories.group_by(&:name)
  end
end

## app/views/blogs/show.html.erb
<p>Name: <%=h user.name %></p>
<h3><%= posts.length %> Posts</h3>
<% posts.each do |post| %>
  ...
<% end %>
<ul>
  <% categories.each do |category| %>
    <li><%=h category %></li>
  <% end %>
</ul>

データベースで単純に呼び出すものを使用して、ビューでどのように表示されるかを確認してください。このソリューションの利点は、呼び出されていないヘルパー メソッドがアクションから時間がかからないことです。

必要に応じて、ヘルパー メソッドをモジュールに抽象化し、そのモジュールを ApplicationController に含めます。

于 2008-10-16T22:55:04.290 に答える