ruby-on-rails - 带有“if”语句的嵌套循环
问题描述
我正在尝试遍历一组选项,并检查每个选项以查看它是否与不同数组中的不同选项匹配。如果两个选项匹配,做一件事,如果他们不匹配,做另一件事。
我有 3^2 个可用选项,它运行了 9 次。它是(true, false, false)
, (false, true, false)
, (false, false, true)
, 这并不理想。相反,我想看到一些类似的东西:(true)
, (false)
, (true)
。
它位于我前端的 erb 文件中。我意识到那里不应该有逻辑,并且很高兴重构建议,但在我弄清楚如何使循环工作之后确实计划将其移出。
前端代码:
<% @available_sites.each do |available_site| %>
<% @sites.each do |site| %>
<% if site.review_site == available_site.name %>
<div class="site-row columns">
<div class="column col-4 col-md-10 col-mx-auto">
<div class="site-tile">
<a href="<%= site.direct_review_url %>" style="background-image: url(<%= image_path("review_site_logos/#{site.review_site}.png")%>); background-size: cover;"></a>
</div>
</div>
<div class="column col-4 col-md-10 col-mx-auto">
<span>Average Rating: <%= site.average_rating %></span>
<span>Review Site: <a href="<%= site.direct_review_url %>"><%= site.review_site %></a></span>
</div>
<div class="column col-4 col-md-10 col-mx-auto is-flex-centered request-row-buttons">
<%= link_to 'Show', [site.location, site] %>
<%= link_to 'Edit', [:edit, site.location, site] %>
<%= link_to 'Destroy', [site.location, site], method: :delete, data: { confirm: 'Are you sure?' } %>
</div>
</div>
<% elsif site.review_site != available_site.name %>
<div class="site-row columns">
<div class="column col-4 col-md-10 col-mx-auto">
<div class="site-tile">
<a href="<%= available_site.link_to_info %>" style="background-image: url(<%= image_path("review_site_logos/#{available_site.name}.png")%>); background-size: cover;"></a>
</div>
</div>
<div class="column col-4 col-md-10 col-mx-auto">
<span>Sign Up for <%= available_site.name %> Business Page: <%= available_site.link_to_signup %></span>
<span>Review Site: <a href="<%= site.direct_review_url %>"><%= site.review_site %></a></span>
</div>
<div class="column col-4 col-md-10 col-mx-auto is-flex-centered">
<%= link_to "Add #{available_site.name} to Review App", new_location_site_path(review_site: "#{available_site.name}"), class: 'btn btn-primary' %>
</div>
</div>
<% end %>
<% end %>
<% end %>
相关控制器代码sites_controller.rb
- policy_scope 用于授权:
def index
@sites = policy_scope(@location.sites)
@available_sites = AvailableSite.all
end
相关架构代码
create_table "sites", force: :cascade do |t|
t.bigint "location_id"
t.string "review_site"
t.string "direct_review_url"
t.string "place_id"
t.decimal "average_rating"
t.jsonb "extra_data", default: {}, null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "rating_count"
t.index ["extra_data"], name: "index_sites_on_extra_data", using: :gin
t.index ["location_id"], name: "index_sites_on_location_id"
end
create_table "available_sites", force: :cascade do |t|
t.string "name"
t.string "link_to_info"
t.string "link_to_signup"
t.string "base_review_url"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["name"], name: "index_available_sites_on_name"
end
我正在寻找处理嵌套循环的帮助/新方向。
解决方案
为了确保我们在同一页面上,我将重申您的问题:
您有一个AvailableSite
s 列表,并且您希望根据您是否有一个可见Site
的信息来显示不同的信息。
如果这是准确的,你会想要使用find
. 就像是:
<% @available_sites.each do |available_site| %>
<% site = @sites.find { |s| s.review_site == available_site.name } %>
<% if site.present? %>
<%# view fragment when you have a site %>
<% else %>
<%# view fragment when you don't have a site %>
<% end %>
<% end %>
这将只输出一组元素AvailableSite
。
推荐阅读
- node.js - React.js - 如何独立或一起部署客户端和服务器?
- postgresql - psql:错误:无法连接到服务器:致命:角色“postgres”不存在
- xslt - 提取部分输入字符串
- c# - DataTemplate 未正确绑定
- java - 多数据库连接 JPA
- ios - iOS14 中的 UIViewControllerRepresentable 和属性包装器行为,与 CropViewController 一起使用
- android - 是否可以为 Android 上的 Outlook Mobile 构建针对本地 Exchange 部署运行的 Outlook 插件
- node.js - 找不到“AppModule”Angular 10 的 NgModule 元数据中的错误
- google-chrome-extension - Chrome 扩展新手问题 - 检查网页是否有条目,单击超链接并刷新
- visual-studio - Visual Studio -> 代码样式首选项:无严重性不存在