2017-08-24 47 views
0

我有一个表单,我用它来创建一个列表。我想让用户能够为将要保存的新项目创建新表单以供将来列表制作。我想要一个“+”按钮来添加通过JavaScript创建一个新的表单。它对我的测试用户非常有用,但事情变得混乱,所以我让一个新用户重新开始。当我试图加载我新的列表页我让他用这样的:JavaScript是设置变量部分被附加在Rails实际设置之前

undefined method `id' for nil:NilClass 

具体来说,它是指向该位在我的JavaScript:

$(this).parents(':eq(1)').append("<%= escape_javascript render partial: 'shared/user_item_form', locals: {f: @f, category_id: @category.id} %>"); 

我需要将这些变量传递给任何新形式这将被渲染,但这些变量依赖于从服务器或数据库传递的数据或其他内容。看起来它试图首先运行我的JavaScript,尽管我声明了$(document).ready

这里是整个表格。

26行是这个问题开始的地方,我声明了一些类变量,以便它们在下面达到我的javascript。

第43行是我渲染第一个部分的地方,当用户按下“+”时,第一个部分将被复制。当用户按下该按钮时,我想要在它下面弹出相同的确切形式。

https://pastebin.com/ieLYfYm4

我是一个真正的noob当涉及到合并JS和Rails,我一直在挣扎了很多与我的项目的一部分。我真的不明白什么是首先加载或我的JS应该去的地方。尽管到现在为止,我一起砍了什么似乎都很好。不知道为什么它现在甚至在任何时候都有问题。也许我的浏览器在缓存中存储了一些能够防止此错误被引发的内容?

代码,如果你能不看pastbin

<div class="new-list"> 
    <h2>New List</h2> 
    <%= form_for @list, url: list_path, html: {class: "form-signin"} do |f| %> 
     <%= f.text_field :name, placeholder: "Name your list (optional)" %> 
     <!-- Category --> 
     <div class="categories"> 
      <% current_user.categories.each do |category| %> 
       <h3 class="category"> 
        <%= category.name %> 
       </h3> 
       <!-- Items --> 
       <div class="dropdown-button" data-toggle="collapse" data-target="#<%= category.name %>"> 
        <span class="glyphicon glyphicon-chevron-down"></span> 
       </div> 
       <!-- Dropdown div --> 
       <div id="<%= category.name %>" class="collapse"> 
        <div class="table-responsive"> 
         <!-- User Item table --> 
         <table class="items"> 
          <tr> 
           <th>Add</th> 
           <th>Name</th> 
           <th>Price</th> 
           <th>Qnty</th> 
          </tr> 
         <% category.user_items.each do |item| %> 
          <%= f.fields_for l = @list.list_items.build, index: l.id do |list_item| %> 
           <% @category = category %> 
           <% @f = f %> 
           <tr> 
            <td><%= list_item.check_box :user_item_id, { checked: false }, item.id, nil %></td> 
            <td><%= item.name %></td> 
            <td><%= item.price %></td> 
            <td><%= list_item.number_field :quantity, 
                            min: 1, 
                            class: "num"%></td> 
           </tr> 
          <% end %> 
         <% end %> 
         </table> 
        </div> 
        <h3>Create a new item here:</h3> 
        <%= render partial: 'shared/user_item_form', locals: {f: f, category_id: category.id} %> 
        <h4><span class="glyphicon glyphicon-plus" id="add-item"></span>Add More</h4> 
       </div> 
      <% end %> <!-- current_user.categories --> 
      <br> 
      <%= f.submit "Submit" %> 
     </div> 
    <% end %> 
</div> 

<!-- dropdown button script --> 
<script> 
    $(document).ready(function() { 
     $('.data-toggle').collapse(); 
     addNewItemForm(); 
    }); 

function addNewItemForm(){ 
    $('#add-item').click(function(){ 
     $(this).parents(':eq(1)').append("<%= escape_javascript render partial: 'shared/user_item_form', locals: {f: @f, category_id: @category.id} %>"); 
    }); 
} 
</script> 
+1

错误告诉你'@ category'是'零';你在哪里设置该变量?它必须在与视图相关的控制器操作中设置。你能显示控制器代码吗?但请在您的问题中将代码添加为文本(而不是图片或链接)。 – Gerry

+0

将代码添加到原始问题中。我将@category设置为嵌套形式的一半左右 – Jim

+1

仔细检查'category.user_items'的值,它似乎是'nil',这导致'@ category'也是'nil'。 – Gerry

回答

2

的问题是,当你调用它的JavaScript函数addNewItemForm()在脚本的底部评估,而是当页面首先完全渲染,然后在那个时刻和那个地方,当Rails试图评估下面的字符串:<%= escape_javascript render partial: 'shared/user_item_form', locals: {f: @f, category_id: @category.id} %> @category变量超出了作用域并且未定义。

实际上,您需要点击一个带有相应参数的按钮来创建另一个服务器请求,然后让服务器完成这项工作:呈现新的部分并调用JavaScript来更改HTML。

您可以用下面的例子做到这一点很容易:

<%= link_to 'Add New Item', [:new, category, :items], remote: true %>

( “远程:真正的” 将使一个Ajax请求)。

您将获得网址参数类别中的控制器,可以再次对其进行实例化:

@category = Category.find(params[:category_id])

,然后用下面的代码响应(new.js.ERB):

<%= j render 'shared/user_item_form', category_id: @category.id %>

(这简直是你的线的简写)

这里是参考类似的例子文件:http://guides.rubyonrails.org/working_with_javascript_in_rails.html#a-simple-example

+0

好吧,我只是仍然感到困惑,在发送请求并从控制器中获取类别后,该线条粘在哪里? <%= j render'shared/user_item_form',category_id:@ category.id%> 我是否从控制器渲染它? – Jim

+0

另外,你知道我怎么可以通过我的form_builder params?我可以通过它,但它变成了一个字符串。当我尝试对它进行常量化时,出现以下错误: 'NameError异常:错误的常量名称 Jim

+0

找出我的第一个问题。对于那些不知道的人,你可以在控制器的视图目录下创建一个名为new.js.erb的文件,并将你的javascript放在那里。它会自动被控制器调用/呈现。 我决定为我的第二个问题开放另一个问题,因为我最初的问题已经解决。你的解决方案奏效,谢谢! – Jim