Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么我会得到这个;“未定义的方法”;Rails模型回调出错,将方法作为符号传递?_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 为什么我会得到这个;“未定义的方法”;Rails模型回调出错,将方法作为符号传递?

Ruby on rails 为什么我会得到这个;“未定义的方法”;Rails模型回调出错,将方法作为符号传递?,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我有一个名为“Post”的类,当它被更改或尚未转换时,应该将其标记内容转换为HTML。我试图使用带有if:参数的before\u save回调,但是当我尝试运行测试时,无论传递给if的是什么,我都会遇到这个错误: 测试在1:55开始。。。雷克流产了 C:/Users/user/Documents/GitHub/jw/app/models/post.rb:7:in C:/Users/user/Documents/GitHub/jw/app/models/post.rb:1:in C:/Users

我有一个名为“Post”的类,当它被更改或尚未转换时,应该将其标记内容转换为HTML。我试图使用带有
if:
参数的before\u save回调,但是当我尝试运行测试时,无论传递给
if
的是什么,我都会遇到这个错误:

测试在1:55开始。。。雷克流产了
C:/Users/user/Documents/GitHub/jw/app/models/post.rb:7:in
C:/Users/user/Documents/GitHub/jw/app/models/post.rb:1:in
C:/Users/user/Documents/GitHub/jw/test/test\u helper.rb:12:in
C:/Users/user/Documents/GitHub/jw/test/test\u helper.rb:5:in
C:/Users/user/Documents/GitHub/jw/test/models/post_test.rb:1:in

-e:1:在“加载”中
-e:1:在“”任务中:TOP=>test:run=>test:units(通过使用--trace运行任务查看完整跟踪)运行选项:--seed 13458

#运行测试:

以0.002000秒、0.0000次测试/秒、0.0000次断言/秒的速度完成测试

0个测试、0个断言、0个失败、0个错误、0个跳过

进程已完成,退出代码为1

这就是所讨论的模型:

class Post < ActiveRecord::Base
  include ActiveModel::Dirty

  before_save :convert_markdown, if: :markdown_changed_or_html_nil?

  belongs_to :user
  validates :user, :title, :content_markdown, { presence: true, on: create }
  validates_associated :user

  protected
    def convert_markdown
      markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, space_after_headers: true, underline: true)
      self.content_html = markdown.render(content_markdown)
    end

    def markdown_changed_or_html_nil?
      content_markdown.changed? || content_markdown.nil?
    end
end
class Post
我正在使用Ruby 2.0.0和Rails 4.0.2

我可能犯了一个非常基本的错误——我还在学习Rails


编辑:这是post_test.rb

require 'test_helper'

class PostTest < ActiveSupport::TestCase
  test 'saving an empty object fails' do
    new_post = Post.new

    assert_not new_post.save
  end

  test 'validates that given user id corresponds to user' do
    # This will create a user with a given id so we can use the next one up
    test_user = User.create({ name: 'Johnny Test', email: 'johnny.test@example.com',
                            password: 'password', password_confirmation: 'password' })

    # Use next id up - there's no reason it should be taken at this point
    given_user_id = test_user.id + 1

    post_with_invalid_user = Post.new({ title: 'Look at my glorious title', content_markdown: 'Sick content',
                                      user_id: given_user_id })

    assert_not post_with_invalid_user.save
  end

  test 'converts markdown into html' do
    # This is a really really basic test just to make sure a conversion happens
    new_post = Post.new({ title: 'Check out this markdown, baby', content_markdown: 'I got some *sick* markdown',
                        user_id: users(:paul).id })

    assert_equal '<p>I got some <em>sick</em> markdown</p>', new_post.content_html
  end
end
需要“测试助手”
类PostTest
这可能不是您的主要问题(因为您的错误消息似乎与此无关),但您没有正确使用
更改?
<代码>已更改?
需要在模型对象上调用,可以选择以属性名称作为前缀。因此,您的条件方法应该如下所示:

def markdown_changed_or_html_nil?
  # based on your method name, shouldn't this be:
  # content_markdown_changed? || content_html.nil?
  content_markdown_changed? || content_markdown.nil?
end
有关
Dirty
方法的更多信息,请访问

同时

我很确定Rails 4没有将
Dirty
移出
ActiveRecord::Base
,因此您不需要手动
在模型中包含ActiveModel::Dirty

同时

这一行:

validates :user, :title, :content_markdown, { presence: true, on: create }
应该是:

validates :user, :title, :content_markdown, { presence: true, on: :create }

验证:user,:title,:content\u markdown,{presence:true,on:create}

应该是


验证:用户,:标题,:内容\u标记,状态:true,on::创建


我认为ruby只是在
验证:user,:title,:content\u markdown
之后解释所有内容,作为validates函数的一部分。为什么会这样,我对解释器知之甚少,但ruby有很多这些“奇怪”的错误。查看CaptChrisD所说的行号,在遇到行号时总是一个好的开始。

我认为这些方法不需要保护,它们可能也不应该受到保护:这可能是您的问题-将它们置于受保护状态意味着只能从该类的实例调用它们。如果删除受保护的
,是否会遇到同样的问题?@MaxWilliams如果在实际回调中使用,回调将从类的实例中触发。所以这不应该是个问题。我认为这更可能是测试的问题哦,是的,我之前试过了-我仍然得到同样的错误。@Baloo,如果我发布测试会有帮助吗?它似乎没有运行,但我想它可能有一些用处。我认为这个错误在这里可能会产生误导。请注意,错误显示在第7行。如果您为Post类发布的代码是源代码中真正的代码(您没有删除注释或额外的换行符)。然后,我会尝试删除您的验证,看看是否适合您。那就从这里开始吧。你说的那句话确实是对的——改变了它。谢谢:)是的,本杰明的评论也为我指明了创建符号的方向。非常感谢。繁荣知道了!该行应该是
validates:user,:title,:content\u markdown,presence:true,on::create
-
create
应该是一个符号。谢谢:)