代码之家  ›  专栏  ›  技术社区  ›  Justin Puda

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

  •  1
  • Justin Puda  · 技术社区  · 6 年前

    我在一个页面上有一个表单,它正在为“指南”构建一个“提示”。在表单下面,我在所有的@guide上运行一个each循环。提示。我不断收到一个错误,因为每个循环都在加载表单空白对象,因为它将其视为提示。目前,我已经通过在页面加载后使用jQuery注入表单解决了这个问题,但必须有更好的解决方案。

    导轨上的每个环。html。雇员再培训局

        <% 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\U控制器。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 回复  |  直到 6 年前
        1
  •  1
  •   blnc Marcus Walser    6 年前

    这是另一个解决方案 that does not separate the logic 并清除循环的空数组语句

    导轨上的每个环。html。雇员再培训局

      <% @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? %>
    

    尖端形状部分

    通过从关联外部创建Tip(即不使用build),它将不会加载到类变量的子级中

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

        2
  •  1
  •   m3characters    6 年前

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

    <% if @guide.tips.count > 1 %> (假设始终显示空的“构建”提示)

    或者您可以使用:

    <% next unless tip.persisted? %>

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

    你也不需要 blank? 检查为 .each 在空枚举器上,它不会执行块,只要guide和tips之间存在has\u many关系,它就会始终生成一个集合代理。

    我会这样写:

    <% @guide.tips.each do |tip| %> <% next unless tip.persisted? %> <div class="row mx-1"> <div class="col-md-3 border-right"> ... <% end %>