2013-08-25 79 views
0

我有可變@posts_by_month在兩個控制器定義並在兩個視圖中所使用的實例之間共享代碼:如何兩個控制器

Posts控制器:

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

我有兩個問題。有沒有什麼辦法可以定義@posts_by_month實例變量,以便我可以在兩個視圖中都可以使用它,而無需在每個相應的控制器中重複該視圖?

其次,有沒有什麼辦法可以使<p><%= millisecond %>milliseconds <%= posts.count %></p>的毫秒部分變成一個導致歸檔視圖的鏈接?

注意:在我的應用程序中毫秒將被替換爲月份,如在歸檔視圖中。

回答

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 
+0

你有沒有參考它說控制器狀態被複制到產生視圖狀態的地方?我寧願認爲(並希望)通過視圖中的代理訪問控制器狀態,並且不會進行不必要的複製(除非明確指出,例如通過替換爲模板等) – Domi

1

是的,你可以減少同一個變量的重複。一種方法是使用過濾器:

定義mthod內應用程序控制器:

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