提交部分表单时出现nil对象错误

时间:2010-12-29 17:54:11

标签: ruby-on-rails

Rails 2.3.5

我遇到一个问题,表单选择正常工作,除非提交表单时我对正在使用的数组有一个nil错误。我不明白Select标签是如何工作的,并且生成正确的HTML,但是在提交表单时也会对数组给出nil错误。此外,如果我从控制器中取出逻辑并直接将其粘贴在局部,它可以正常工作。谢谢你的帮助。

在控制器中,我使用“新”方法获取此代码:

@directories = Directory.find(:all, :conditions => {:id => session[:directories_with_view_access]})
@directories.collect! {|u| [u.name, u.id]}

在“新”视图的部分内容中,我有以下代码:

<%= f.select(:directory_id, @directories, :prompt => 'Select') %>

呈现此HTML:

<select id="card_directory_id" name="contact[directory_id]"><option value="">Select</option>
<option value="2">dir_test_1</option>
<option value="4">dir_test_2</option>
<option value="6">dir_test_3</option>

问题是,当我提交表单时,我收到以下错误:

  

当你没有时,你有一个零对象   期待它!你可能已经预料到了   数组的实例。发生错误   同时评估nil.inject

如果我从控制器中取出逻辑并将其放入局部,那么一切正常:

<%= f.select(:directory_id, Directory.find(:all, :conditions => {:id => session[:directories_with_view_access]}).collect {|u| [u.name, u.id]}, :prompt => 'Select') %>

1 个答案:

答案 0 :(得分:1)

您在这里使用select标签不是问题。

如果您发布了堆栈跟踪,我将能够更好地诊断您的问题,但是从您所描述的内容来看,我的猜测是您的表单向create之类的操作提交了一个帖子请求,将重定向转换为再次将表单呈现为部分的页面。 @directories未在重定向的操作中设置,该操作负责呈现在新操作中设置的视图。

在您的创建操作中查找重定向网址,然后确保在 操作中设置@directories(很可能是show操作,如redirect_to url_for(@object)中所示),正如你的新行动一样。

这里要理解的关键是控制器操作实际处理您的POST请求,呈现视图的操作是什么,以及确保在那里定义必要的变量。如果您使用传统的Rails架构,那么读取RESTful路由是必不可少的,例如脚本/生成中的脚本为您构建的。