【问题标题】:Removing logic from view in Ruby on Rails从 Ruby on Rails 的视图中删除逻辑
【发布时间】:2016-05-12 22:24:16
【问题描述】:

我有一个索引视图,它遍历具有特定 state_taxonomies 的产品列表。我能够让逻辑在视图中处理查询请求,但我假设 <% Product.where(id: st.product_id).each do |tax| %> 逻辑不应该显示在视图中?

  1. 我应该把这个逻辑放在哪里?
  2. 我应该如何创建这个方法?我尝试了几条路线,但都失败了。

产品索引查看用户 Bootstrap nav-pills:

<div>
  <% @state_taxonomies.each do |st| %>
    <div class="tab-pane" id="<%= st.id %>">
      <% Product.where(id: st.product_id).each do |tax| %>
        <%= link_to tax.title, tax %>
      <% end %>
    </div>
  <% end %>
</div>

产品控制器:

def index
  @products = Product.all.page params[:page]
  @state_taxonomies = StateTaxonomy.all 
end

注意:产品 has_many :state_taxonomies 和 state_taxonomy belongs_to :product。

【问题讨论】:

  • 您的逻辑应该完全在 Products 控制器中。您应该在视图中选择您需要的产品,而不是 @products = Porduct..all.page params[:page],而不是在视图级别执行此操作。
  • 我编辑了你的问题,因为你有一个 &lt;/div&gt; 没有对应的 &lt;div&gt;。
  • 如果可能的话,如果答案对您有帮助,请给我们一个职位。如果可能的话,甚至选择一个最喜欢的答案。这可以通过提高答案的质量来帮助那些帮助过你和帮助这个网站的人。
  • 我还没有找到答案。到时候我会告诉你的

标签: ruby-on-rails


【解决方案1】:

你正在做很多查询,首先是在你的控制器Product.all(你似乎没有使用结果)和StateTaxonomy.all。但在您看来更糟糕的是,您为每个 @state_taxonomies 执行一个 Product.where(id: st.product_id)。

你应该研究 n+1 问题和eager loading。此外,永远不要在控制器中的视图中进行查询。

您只需在控制器中查询 StateTaxonomy 时包含产品:

@state_taxonomies = StateTaxonomy.all.includes(:product)

那么在你看来:

<% @state_taxonomies.each do |st| %>
  <div class="tab-pane" id="<%= st.id %>">
    <% st.products.each do |tax| %>
      <%= link_to tax.title, tax %>
    <% end %>
  </div>
<% end %>

编辑: 我刚刚意识到视图不能以这种方式工作。在您的模型中, state_taxonomy 属于一个产品,因此它只能有一个产品。我不知道这是您想要的还是错误。

每个 state_taxonomy 只能显示一种产品:

<% @state_taxonomies.each do |st| %>
  <div class="tab-pane" id="<%= st.id %>">
    <%= link_to st.product.title, st.product %>
  </div>
<% end %>

或者改变两个模型之间的关系,也许你想要has_and_belongs_to_many。

【讨论】:

  • 很好的解决方案。比我的好。
  • 根据您的建议,我得到这些结果'未初始化的常量 StateTaxonomy::Products`
  • @jgrant 我写的有点太快了,我编辑了控制器行。
  • 我看到了同样的结果
  • 抱歉,包含必须是单数:includes(:product),因为您的 state_taxonomy 属于产品。
【解决方案2】:

您的 Products 控制器应类似于:

def index
  @state_taxonomies = StateTaxonomy.all
  @products = Hash.new
  @state_taxonomies.each |st| do 
    @products[st.id] == Product.where(id: st.product_id)
  end
end

这会将您视图中所需的所有内容都存储在@products 中,并且您只能编写:

<% @state_taxonomies.each do |st| %>
  <div class="tab-pane" id="<%= st.id %>">
    <% @products[st.id].each do |tax| %>
      <%= link_to tax.title, tax %>
    <% end %>
  </div>
<% end %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2013-10-21
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多