2013-03-05 80 views
0

我有分別擁有belongs_to和has_many關係的Post和SubCategory模型。Rails:從不同視圖查詢模型

在顯示發佈視圖中,除了顯示單個發佈之外,我還需要運行子類別控制器的索引操作以顯示當前的子類別及其在左導航區域中的所有發佈內容。

這是什麼最好的方法呢?

編輯我已經在使用應用程序控制器,所以我認爲這是最好的途徑,特別是如果我想在其他視圖中做同樣的事情。

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    before_filter :load_application_wide_varibales 

    def load_application_wide_varibales 

    def get_subcategory_and_post 
    @sub_category = SubCategory.all 
    end 
end 

class PostController < ActionController::Base 
    before_filter :get_subcategory_and_post, only: [:show] 

    def show 
    @post = Post.find(params[:id]) 
    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @post } 
    end 
end 

class SubCategoryController < ActionController::Base 
    before_filter :get_subcategory_and_post 
end 

def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
end 
    helper_method :current_user 
    end 
end 

帖子顯示視圖

<% @sub_category.each do |subcat| %> 
<div class="leftnav"> 
<h1 class="name"><%= subcat.name %></h1> 
<% subcat.posts.each do |post| %> 
<ul> 
<li><%= link_to (post.name), post %></li> 
</ul><% end %> 
</div> 

<% end %> 
<div class="rightContent"> 
<p id="notice"> 
    <%= notice %> 
</p> 

<p> 
    <b>Name:</b> 
    <%= post.name %> 
</p> 

<p> 
    <b>Content:</b> 
    <%= post.content %> 
</p> 

</div> 

Post模型:

class Post < ActiveRecord::Base 
    belongs_to :sub_category 
    belongs_to :users 
    validates :name, :content, :sub_category_id, :presence => true 
    attr_accessible :content, :name, :sub_category_id 
    after_save :expire_post_all_cache 
    after_destroy :expire_post_all_cache 

def self.to_csv(options = {}) 
    CSV.generate(options) do |csv| 
    csv << column_names 
    all.each do |post| 
     csv << post.attributes.values_at(*column_names) 
    end 
    end 
end 

def self.all_cached 
    Rails.cache.fetch('Post.all') { all } 
end 

def expire_post_all_cache 
    Rails.cache.delete('Post.all') 
end 
end 

子類別型號:

class SubCategory < ActiveRecord::Base 
    attr_accessible :name 
    belongs_to :category 
    has_many :posts 
    validates :name, :category_id, :presence => true 
end 

工作帖子顯示視圖:

<div class="leftnav"> 
<h1 class="name"><%= @post.sub_category.name %></h1> 
<% @post.sub_category.posts.each do |post|%> 
<ul> 
<li><%= link_to (post.name), post %></li> 
    </ul><% end %> 
    </div> 

<div class="rightContent"> 
<p id="notice"><%= notice %></p> 

<p> 
    <b>Name:</b> 
    <%= @post.name %> 
</p> 

<p> 
    <b>Content:</b> 
    <%= @post.content %> 
</p> 
</div> 

回答

2

我會做一個部分(如_subcategory_list),它需要一個子類別集合並呈現它們。然後,您的發佈視圖可以調用render(partial: 'subcategory/subcategory_list', locals: { subcategories: @post.subcategories })並且您的子類別列表視圖可以執行相同的操作,除了傳遞其@subcategories值。

+0

嗨丹,因爲我可能要出去擴展,以你認爲它可能是更明智下面提到的應用程序控制器配置這個其他看法? – Anthony 2013-03-05 22:11:50

+0

是的,這是有道理的,我沒有意識到你正在加載每個子類別,無論是否加載頁面。不過,我仍然會使用子類別的部分列表,或將其包含在佈局文件中,以便您不必在每個視圖中重複該代碼。 – 2013-03-05 23:44:40

0
redirect_to your_controller_action_url and return 

這會渲染另一個控制器的操作。但是,這與邏輯在控制器中應該如何分離並且通常被認爲是不好的做法相反。

最好的辦法是將SubCategory控制器中的邏輯抽象爲ApplicationController,然後post和sub-category控制器都可以使用它。

下面是用假方法的一個例子:

class ApplicationController < ActionController::Base 
    def get_subcategory_and_post 
    # Logic here 
    end 
end 

class PostController < ActionController::Base 
    before_filter :get_subcategory_and_post, only: [:show] 

    def show 
    # Logic here 
    end 
end 

class SubCategoryController < ActionController::Base 
    before_filter :get_subcategory_and_post 
end 
+0

因爲我已經在使用應用程序控制器,所以我喜歡你的方向。看到我上面的編輯。在posts/show中我得到這個錯誤:未定義的方法'each'爲nil:NilClass。 – Anthony 2013-03-05 22:08:09

+0

好吧,我得到<%@ sub_category.each do | subcat | %>在這裏不需要。我需要抓取當前帖子的sub_category(但post.sub_category.name不起作用),然後調用sub_category.posts。 – Anthony 2013-03-05 23:40:20

+0

你可以發佈你的模型?假設當前文章是一個實例變量,您可能可以在get_subcategory_and_post方法中引用它。如果沒有,你可能有權訪問你的參數,你可以這樣查找。 – 2013-03-06 01:40:38