【问题标题】:Rails create action undefined method 'each' for nil:NilClassRails 为 nil:NilClass 创建动作未定义方法“每个”
【发布时间】:2013-10-01 15:53:30
【问题描述】:

在我的 Rails 应用程序中,我正在创建一个带有 contentEditable div 的表单,因此我必须通过 AJAX“PUT”请求手动将所有数据发送到我的控制器。但是,创建操作不再起作用,并抛出此错误:

Started POST "/submissions" for 98.245.21.165 at 2013-09-25 20:57:51 +0000                                                                                                
Processing by SubmissionsController#create as JSON                                                                                                                        
Parameters: {"title"=>"fyc", "content"=>"fuc", "folder_id"=>"1"}                                                                                                        
User Load (80.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1                                                                                        
(81.3ms)  SELECT COUNT(*) FROM "submissions" WHERE "submissions"."title" = 'fyc'                                                                                       
Completed 500 Internal Server Error in 181ms                                                                                                                              

NoMethodError (undefined method `each' for nil:NilClass):                                                                                                                 
  app/controllers/submissions_controller.rb:16:in `create'

这是我在提交控制器中的创建操作:

def create 

    ajax_title = params[:title]
    ajax_content = params[:content]
    ajax_folder = params[:folder_id]
    ajax_parent = params[:parent_id]
    ajax_children = params[:children]

    @submissions = Submission.where(title: ajax_title)

    if @submissions.empty?
    @submission = Submission.create({title: ajax_title, content: ajax_content, user_id: current_user.id, folder_id: ajax_folder, parent_id: ajax_parent, children: ajax_children})
    else
        @submissions[0].content = ajax_content
        @submissions[0].save
    end
end

第 16 行,Rails 抛出 NoMethodError,是 if @submissions.empty? 之后创建 Submission 实例的行。

我唯一的想法是,也许在我将参数放入 ajax_ 变量的顶部,它返回 nil?我查看了我的路线,可以看到我确实有一个/submissions PUT 请求,该请求路由到这个创建操作,所以这不是问题。

这是有问题的 AJAX 调用:

$("#save-entry").click(function(){
            $.ajax({
                type: "POST",
                url: "/submissions",
                dataType: "json",
                data: {title: $("#title-create-partial").text(), content: $("#content-create-partial").text(), folder_id: <%= @folder.id %>},
                complete: function(){
                    $.get("/ajax_load_events/", {folder: <%= @folder.id %>}, null, "script");
                }
            });
        });

就像我说的,我使用 HTML5 contentEditable div 进行表单输入,所以据我所知,我不能真正依赖 Rails 为我执行 AJAX 调用。这个错误最近才开始发生,我不确定它是如何开始的。

有什么想法吗?我现在很绝望。

更新这是我的 Submission.rb 模型:

class Submission < ActiveRecord::Base

belongs_to :user
belongs_to :folder
belongs_to :parent, :class_name => 'Submission'
has_many :children, :class_name => 'Submission', :foreign_key => 'parent_id', :order => ('updated_at DESC')

attr_accessible :content, :title, :user_id, :folder_id, :parent_id, :children

def self.search(search)
  if search
      where('name LIKE ?', "%#{search}%")
  else
      scoped
  end
end

def attributes_with_children
  attributes.merge(children: children.map(&:attributes_with_children))
end

end

还有我的 Folder.rb 模型:

class Folder < ActiveRecord::Base
attr_accessible :title, :user_id, :parent_id

belongs_to :user
belongs_to :parent, :class_name => 'Folder'
has_many :children, :class_name => 'Folder', :foreign_key => 'parent_id'
has_many :submissions, :order => ('updated_at DESC')

def self.search(search)
where("title like ?", "%#{search}%")
end

end

【问题讨论】:

  • 你能从第16行删除parent_idchildren键,一一创建哈希,看看它是否有效..
  • 好的,我现在就这样做
  • 哦,嘿,在删除 children 键后有效。不过,当 Submission 实例是另一个实例的孩子时,我确实需要 children 键。知道为什么要这样做吗?
  • 首先您能否更新帖子,提供有关提交、父母和子女之间关系的更多信息
  • 添加了我的 submit.rb 和 folder.rb 模型。也许看看那些会有所帮助。基本上提交应该能够有嵌套提交,或孩子。从更高级别的所有提交都属于一个文件夹。

标签: javascript jquery ruby-on-rails ruby ajax


【解决方案1】:

因为submission has_many children那么

Submission.create(:children =&gt; nil) 会抛出以下错误,因为它需要 children 的数组

NoMethodError: You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

但是Submission.create(:children =&gt; []) 不会抛出错误。

在您的示例中,params[:children]nil,因此它会引发错误。所以在控制器中你可以做

ajax_children = Array(params[:children])
#=> [] if params[:children] is nil

这会将nil 转换为[],如果参数是[1,2,3],它保持不变。

通常,请确保传递给模型方法的值在控制器中采用正确的格式,因为用户输入可能会有很大差异。

【讨论】:

  • 谢谢!感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多