Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.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_Rspec - Fatal编程技术网

Ruby on rails Rails控制器创建方法中的预处理无效

Ruby on rails Rails控制器创建方法中的预处理无效,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我正在学习Michael Hartl的教程,并尝试实现类似于twitter的回复功能,即“@122 john smith:hello there”应该是对用户122的回复 我第一次尝试在过滤器之前使用过滤“@XXX-AAA-AAA”部分,但我决定在相同的Micropost#create操作中首先尝试。到目前为止,我已经得到了这个microstostcontroller: class MicropostsController

我正在学习Michael Hartl的教程,并尝试实现类似于twitter的回复功能,即“@122 john smith:hello there”应该是对用户122的回复

我第一次尝试在过滤器之前使用
过滤“@XXX-AAA-AAA”部分,但我决定在相同的
Micropost#create
操作中首先尝试。到目前为止,我已经得到了这个
microstostcontroller

class MicropostsController
这是我试图通过的代码片段测试:

require'spec\u helper'
描述“微污染”是什么
主题{page}
let(:user){FactoryGirl.create(:user)}
在{valid_sign user}之前
描述“微观创造”是什么
在{访问根路径}之前
描述“使用无效信息”吗
它“不应该创造一个微观”吗
预期{点击按钮“发布”}。不应更改(Micropost,
:计数)
结束
请描述“错误消息”的含义
在{单击按钮“发布”}之前
它{应该有_内容('error')}
结束
结束
请描述“使用有效信息”做什么
在{填写“微观内容”之前,加上:“Lorem ipsum”}
它“应该创造一个微成本”吗
预计{click_button“Post”}。应更改(Micropost,
:计数)。按(1)
结束
结束
结束
...
结束
如果我运行这些测试,我会得到以下错误:

故障:
1) 具有无效信息的micropost创建不应创建micropost
失败/错误:预期{单击按钮“发布”}。不应更改(Micropost,:count)
命名错误:
nil:NilClass的未定义方法“[]”
#./app/controllers/microsposts\u controller.rb:14:in'create'
#(评估):2:在“单击按钮”中
#./spec/requests/microspost_pages_spec.rb:11:in `块(5层)in'
#./spec/requests/microspost_pages_spec.rb:11:in `块(4层)in'
2) MicropostPages micropost创建包含无效信息错误消息
失败/错误:在{单击按钮“发布”}之前
命名错误:
nil:NilClass的未定义方法“[]”
#./app/controllers/microsposts\u controller.rb:14:in'create'
#(评估):2:在“单击按钮”中
#./spec/requests/microspost_pages_spec.rb:14:in'block(5层)in'
但是如果我修改测试并注释掉
microspost#create
操作中的所有@XXX过滤:

def创建
@micropost=当前用户.micropost.build(参数[:micropost])
#Rails.logger.info“hoooola”
#正则表达式=/\A@(\d)+(\w\-\124\.)+/i
#message=@micropost.content.dup
#isResponse=message.match(regex)[0]。match(/\d+/)[0]
#@micropost.response=isResponse
如果@micropost.save
flash[:success]=“创建了Micropost!”
将\重定向到根\路径
其他的
@feed_items=[]
呈现“静态页面/主页”
结束
结束
测试通过得很好,新的
Micropost
不是
Nil
对象


这里似乎找不到解释。

错误来自这一行:

isResponse=message.match(regex)[0].match(/\d+/)[0]
检查您的两个匹配调用是否正确匹配。如果在字符串中找不到该模式,则返回
nil
,并在
nil
上进行
[0]
调用。仅在这一行中就有两个可能发生这种情况


尝试将其分散在几行上,检查匹配的返回值,或者扩展正则表达式以一次性正确检查模式。

可能是正则表达式
match(Regex)[0]。match(/\d+/)[0]
导致问题……我使用
irb
尝试了它,它返回了所需的ID。此外,在最坏的情况下,它不应该只在
@micropost.response
字段中写入
Nil
吗?不,因为您是使用
[0]
访问它的,如果正则表达式不匹配,这将抛出完全相同的错误。哦,您太棒了!当正则表达式不匹配时,它确实会抛出相同的错误。非常感谢。如果你发布一个答案,我可以将其标记为正确答案。这似乎正是问题所在,正如@spas所指出的。我完全错过了。另外,我想知道调试控制器的合适方法是什么。我是说,h