0

@posts_by_month2 つのコントローラーで定義されたインスタンス変数があり、2 つのビューで使用されます。

投稿コントローラー:

class PostsController < ApplicationController

def index
    @posts = Post.all
    @posts_by_month = Post.all.group_by { |post| post.created_at.strftime("%L") }

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @posts }
    end
  end  
.
.
end

アーカイブ コントローラ:

class ArchivesController < ApplicationController
  def index  
    @posts_by_month = Post.all.group_by { |post| post.created_at.strftime("%B") }
  end  
end

投稿のインデックス ビュー:

<h1>Listing posts</h1>
.
.
.
<div>
  <% @posts_by_month.each do |millisecond, posts| %>
    <p><%= millisecond %>milliseconds <%= posts.count %></p>
  <% end %>
</div>

アーカイブのインデックス ビュー:

<% @posts_by_month.each do |monthname, posts| %>
<%= monthname %>
<ul>
   <% posts.each do |post| %>
     <h3><%= post.title %></h3>
     <p><%= post.body %></p>
   <% end %>
</ul>
<% end %>

2 つの質問があります。インスタンス変数を定義して@posts_by_month、それぞれのコントローラーで繰り返すことなく両方のビューで使用できるようにする方法はありますか?

第二に、ミリ秒の部分を<p><%= millisecond %>milliseconds <%= posts.count %></p>アーカイブ ビューにつながるリンクにする方法はありますか?

注: 私のアプリでは、ミリ秒はアーカイブ ビューのように月に置き換えられます。

4

2 に答える 2

2

アクションが実行されると (レンダリングとも呼ばれます)、インスタンスは終了します。インスタンス変数はもうありません。

View のインスタンス変数は、実際のインスタンス変数ではありません。View と Controller は異なるクラスにありますが、どうすればインスタンスを共有できますか? 現実には、Rails が行うことは、これらのインスタンス変数を Controller インスタンスから View インスタンスに正確にコピーすることです。

したがって、あなたの質問の答えは次のとおりです。いいえ。

ただし、アプリケーション コントローラーのプライベート メソッドでコードを乾燥させて、PostsController および ArchiveController と共有することはできます。

class ApplicationController
  private
  def posts_by_time(arg)
    Post.all.group_by { |post| post.created_at.strftime(arg) }
  end
end

class PostsController < ApplicationController
  def index
    @posts = posts_by_time "%L"
    # ...
  end
end

class ArchievesController < ApplicationController
  def index
    @posts = posts_by_time "%B"
    # ...
  end
end
于 2013-08-25T10:25:39.640 に答える
1

はい、同じ変数の重複を減らすことができます。1 つの方法は、フィルターを使用することです。

アプリケーション コントローラ内でメソッドを定義します。

class ApplicationController < ActionController::Base
  private
  def find_post_by_month
    @posts_by_month = Post.all.group_by { |post| post.created_at.strftime("%L") }
  end
end

次に、アーカイブおよび投稿コントローラー内で:

class ArchivesController < ApplicationController
  before_filter :find_post_by_month, :only => :index  
  ...    
end


class PostsController < ApplicationController
  before_filter :find_post_by_month, :only => :index  
  ...
end

これにより、@posts_by_month 変数の値が得られます。

そして、言及されたテキストのリンクを作成するには、次のコードを使用する必要があります。

<p><%= link_to "#{millisecond} milliseconds", path %></p>   # Replace path with your url
于 2013-08-25T10:25:36.510 に答える