0

我有 Post 和 SubCategory 模型,它们分别具有 belongs_to 和 has_many 关系。

在 Post 的 Show 视图中,除了显示单个 Post 之外,我还需要运行 SubCategory 控制器的 index 操作以在左侧 Nav 区域中显示当前 SubCategory 及其所有 Post。

解决这个问题的最佳方法是什么?

编辑我已经在使用应用程序控制器,所以我认为这是最好的方法,特别是如果我想在其他视图中做同样的事情。

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>

岗位型号:

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

2 回答 2

2

我会制作一个部分(类似于_subcategory_list),它采用子类别集合并呈现它们。然后您的 Post 视图可以调用render(partial: 'subcategory/subcategory_list', locals: { subcategories: @post.subcategories })并且您的 SubCategory 列表视图可以执行相同的操作,只是传入其 @subcategories 值。

于 2013-03-05T21:14:09.207 回答
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
于 2013-03-05T21:16:07.920 回答