Nil:首先在页面上加载Form的构建对象时每个循环上的nil类错误

时间:2018-03-07 16:49:23

标签: ruby-on-rails rails-activerecord

我在页面上有一个表单正在构建“指南”的“提示”。在表单下方,我在所有@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 %>

2 个答案:

答案 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 %>

Another Example / Q&A