Ruby on rails Nil:Nil类错误,当表单首先加载到页面上以生成对象时,每个循环都会出现错误

Ruby on rails Nil:Nil类错误,当表单首先加载到页面上以生成对象时,每个循环都会出现错误,ruby-on-rails,rails-activerecord,Ruby On Rails,Rails Activerecord,我在一个页面上有一个表单,它正在为“指南”创建一个“提示”。在表单下方,我正在所有@guide.tips上运行一个each循环。当each循环加载forms空白对象时,我不断收到一个错误,因为它将其视为提示。我目前已经通过使用jQuery在页面加载后注入表单解决了这个问题,但必须有更好的解决方案 Guide.html.erb上的每个循环 <% if !@guide.tips.blank? %> <% @guide.tips.each do |tip| %&g

我在一个页面上有一个表单,它正在为“指南”创建一个“提示”。在表单下方,我正在所有@guide.tips上运行一个each循环。当each循环加载forms空白对象时,我不断收到一个错误,因为它将其视为提示。我目前已经通过使用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 %>
      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
  <% @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, @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 %>

提示标题

您的提示


使用已有的结构,您可以执行以下操作:

1%>
(假设始终显示空的“构建”提示)

或者您可以使用:

在循环内部,在实际窗体之前

您也不需要将
空白?
检查为
。空枚举器上的每个
都不会执行块,并且只要指南和提示之间有很多关系,它就会始终生成一个集合代理

我会这样写:


...

这里有另一个解决方案
,它不分离控制器和视图之间的逻辑
,并清理循环的空数组语句

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 %>
      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
  <% @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, @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 %>
通过从关联外部创建提示(即不使用构建),它将不会加载到类变量的子级中

<%= 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 %>

提示标题

您的提示


这对我来说非常有效,似乎是实现我想要的目标的一个好方法!