繁体   English   中英

Rails无法弄清楚为什么我遇到了NoMethodError

[英]Rails can't figure out why i'm hitting NoMethodError

我试图实现基于关闭这个例子可排序列表功能- http://railscasts.com/episodes/147-sortable-lists-revised

问题是当我删除元素时,我会不断收到此错误消息:

Started POST "/applications/sort" for 127.0.0.1 at 2012-12-04 11:14:45 -0600
Processing by ApplicationsController#sort as */*
  Parameters: {"application_application_field_attributes_0"=>["id"], "application_application_field_attributes_1"=>["id"], "application_application_field_attributes_2"=>["id"]}
Completed 500 Internal Server Error in 1ms

NoMethodError (undefined method `each_with_index' for nil:NilClass):
  app/controllers/applications_controller.rb:91:in `sort'

views / applications / _form.html.erb

<%= form_for(@application, :class => "main") do |f| %>
...
<div class="sortable" data-update-url="<%= sort_applications_url %>">
    <%= f.fields_for :application_field do |fields| %>
        <%= render 'application_field_fields', f: fields %>  
    <% end %>
</div>
<% end %>

views / applications / _application_field_fields.html.erb

<div class="formRow" id="<%= f.object.position %>">
    <div class="grid2"><%= f.label :field_name %></div>
    <div class="grid3"><%= f.text_field :field_name %></div>
    <div class="grid2"><%= f.label :field_type %></div>
    <div class="grid3"><%= f.text_field :field_type %></div>
    <!-- Need to store the hidden field _destroy here so we can access it via jQuery -->
    <%= f.hidden_field :_destroy %>
    <div class="grid2" align="center"><%= link_to "Remove", '#', class: "remove_fields"%></div>
    <div class="clear"></div>
</div>

applications.js

$('.sortable').sortable({ 
    placeholder: "ui-state-highlight",
    forcePlaceholderSize: true,
    start: function(event, ui) {
        ui.item.addClass('dragging');
    },
    stop: function(event, ui) {
        ui.item.removeClass('dragging');
    },
    update: function(event, ui) {
        $.post($(this).data('update-url'), $(this).sortable('serialize'));
    }
});

控制器/应用程序#sort

# POST /applications/sort
  def sort
    puts '*********'
    puts '#####'
    puts 'params = ' #{params}
    puts '********'
    params[:application].each_with_index do |id, index| 
        Application.update_all({position: index+1}, {id: id})
    end
    render :nothing => true
  end

当我放置一个可排序元素时,您可以看到我的params哈希为空。 为什么会这样,我该如何解决?

编辑

我将发布模型,以便您可以查看关系

class Application < ActiveRecord::Base
    belongs_to :company
    has_many :application_field, :order => "position"
    accepts_nested_attributes_for :application_field, :allow_destroy => true
    attr_accessible :application_name, :application_field_attributes
end
class ApplicationField < ActiveRecord::Base
    belongs_to :application
    has_many :application_fields_value
    attr_accessible :field_name, :field_type, :field_value, :application_field_values_attributes
    accepts_nested_attributes_for :application_fields_value, :allow_destroy => true
end

您的参数没有正确的结构,因此params[:application]为nil。

这是因为您没有将值传递给表单上的应用程序。 然后,在您看来,它尝试遍历一个集合,但是它是一个nil值。

尝试通过做调试

puts "params => #{params.inspect}" 

在您的排序操作中进行迭代之前。

如果您无法通过执行此操作解决问题,请将其结果粘贴到plz。

我通过改变解决了

<div class="formRow" id="<%= f.object.position %>">
    <div class="grid2"><%= f.label :field_name %></div>
    <div class="grid3"><%= f.text_field :field_name %></div>
    <div class="grid2"><%= f.label :field_type %></div>
    <div class="grid3"><%= f.text_field :field_type %></div>
    <!-- Need to store the hidden field _destroy here so we can access it via jQuery -->
    <%= f.hidden_field :_destroy %>
    <div class="grid2" align="center"><%= link_to "Remove", '#', class: "remove_fields"%></div>
    <div class="clear"></div>
</div>

<%= content_tag_for :div, f.object, :class => "formRow" do %>
    <div class="grid2"><%= f.label :field_name %></div>
    <div class="grid3"><%= f.text_field :field_name %></div>
    <div class="grid2"><%= f.label :field_type %></div>
    <div class="grid3"><%= f.text_field :field_type %></div>
    <!-- Need to store the hidden field _destroy here so we can access it via jQuery -->
    <%= f.hidden_field :_destroy %>
    <div class="grid2" align="center"><%= link_to "Remove", '#', class: "remove_fields"%></div>
    <div class="clear"></div>
<% end %>

有人可以解释为什么这样做吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM