我在页面上有一个表单正在构建“指南”的“提示”。在表单下方,我在所有@guide.tips上运行每个循环。我不断收到错误,因为每个循环都在加载表单空白对象,因为它将其视为提示。我目前通过使用jQuery在页面加载后注入表单来解决问题,但必须有一个更好的解决方案。
Guide.html.erb上的每个循环
<% if !@guide.tips.blank? %>
<% @guide.tips.each do |tip| %>
<div class="row mx-1">
<div class="col-md-3 border-right">
<div class="float-left">
<%= image_tag avatar_url(tip.user), class: "float-left text-left align-middle rounded img-fluid mx-3", width: "30%" %>
<p><%= tip.user.fullname %></p>
</div>
<div class="float-right mr-3">
<%= link_to like_tip_path(tip), method: :put do %>
<div class="fas fa-angle-up"></div>
<%= tip.get_upvotes.size %>
<% end %><br/>
<%= link_to dislike_tip_path(tip), method: :put do %>
<div class="fas fa-angle-down"></div>
<%= tip.get_downvotes.size %>
<% end %>
</div>
</div>
<div class="col-md-8 ml-3">
<h6><%= tip.title %> -<span class="ml-1"><small><%= tip.created_at.strftime("%A, %d %b %Y %l:%M %p")%></small></span></h6>
<%= tip.tip %>
</div>
</div><hr/>
<% end %>
<% end %>
Tips_Controller.rb
def new
@guide = Guide.find(params[:guide_id])
@tip = Tip.new
end
def edit
end
def create
@guide = Guide.find(params[:guide_id])
params[:tip][:user_id] = current_user.id
@tip = @guide.tips.create!(tip_params)
redirect_to guide_path(@guide)
end
提示表单部分
<%= form_for([@guide, @guide.tips.build]) do |f| %>
<div class="form-group row">
<div class="col-sm-12">
<p class="text-left">Tip Title</p>
<%= f.text_field :title, placeholder: "Enter Title", class: "form-control" %>
</div>
<div class="col-sm-12 mt-2">
<p class="text-left">Your Tip</p>
<%= f.text_area :tip, placeholder:"What's your tip for this travel guide?", class: 'form-control' %>
</div>
</div>
<div class="form-group row">
<div class="col-md">
<%= f.submit 'Submit', class: 'btn btn-primary btn-block' %>
</div>
</div>
<% end %>
答案 0 :(得分:1)
使用您已经拥有的结构:
<% if @guide.tips.count > 1 %>
(假设这将始终显示为空&#34;构建&#34;提示)
或者您可以使用:
<% next unless tip.persisted? %>
循环内部,在实际表单之前。
你也不需要blank?
检查作为.each
,空的枚举器只是不会执行该块,并且只要有一个has_many关系在指南和提示之间,它总是会产生一个集合代理。
我会把它写成:
<% @guide.tips.each do |tip| %>
<% next unless tip.persisted? %>
<div class="row mx-1">
<div class="col-md-3 border-right">
...
<% end %>
答案 1 :(得分:1)
这是控制器和视图之间的另一个解决方案that does not separate the logic
,并清理循环的空数组语句
Guide.html.erb上的每个循环
<% @guide.tips.each do |tip| %>
<div class="row mx-1">
<div class="col-md-3 border-right">
<div class="float-left">
<%= image_tag avatar_url(tip.user), class: "float-left text-left align-middle rounded img-fluid mx-3", width: "30%" %>
<p><%= tip.user.fullname %></p>
</div>
<div class="float-right mr-3">
<%= link_to like_tip_path(tip), method: :put do %>
<div class="fas fa-angle-up"></div>
<%= tip.get_upvotes.size %>
<% end %><br/>
<%= link_to dislike_tip_path(tip), method: :put do %>
<div class="fas fa-angle-down"></div>
<%= tip.get_downvotes.size %>
<% end %>
</div>
</div>
<div class="col-md-8 ml-3">
<h6><%= tip.title %> -<span class="ml-1"><small><%= tip.created_at.strftime("%A, %d %b %Y %l:%M %p")%></small></span></h6>
<%= tip.tip %>
</div>
</div><hr/>
<% end unless @guide.tips.blank? %>
提示表单部分
通过从关联外部创建提示(即不使用构建),它将不会被加载到类变量的子级中
<%= form_for([@guide, Tip.new(guide: @guide)]) do |f| %>
<div class="form-group row">
<div class="col-sm-12">
<p class="text-left">Tip Title</p>
<%= f.text_field :title, placeholder: "Enter Title", class: "form-control" %>
</div>
<div class="col-sm-12 mt-2">
<p class="text-left">Your Tip</p>
<%= f.text_area :tip, placeholder:"What's your tip for this travel guide?", class: 'form-control' %>
</div>
</div>
<div class="form-group row">
<div class="col-md">
<%= f.submit 'Submit', class: 'btn btn-primary btn-block' %>
</div>
</div>
<% end %>