如何在隐藏变量中传递(或序列化?)ActiveRecord对象?

时间:2011-11-20 06:22:21

标签: ruby-on-rails activerecord controller erb

RoR以“约会优于配置”而闻名,所以很可能我的问题已经解决了 - 我不知道我应该遵循的惯例。

我有2个模型对象,ParseExceptionParseResolution,以及ParseResolution belongs_to ParseException。

我只是在Rails脚手架上创建一个管理面板,我想添加一个新的ParseResolution对象,绑定到ParseException对象。

为两个模型生成控制器后,我从parse_resolution/new添加了一个指向parse_exception/index的链接。由于ParseResolution需要知道它正在解析哪个ParseException(belongs_to),我也将它作为参数传递:

<td><%= link_to 'Add Resolution', new_parse_resolution_path(:parse_exception => parse_exception) %></td>

到目前为止一切顺利。

在我的ParseResolution控制器中,我有:

def new
  @parse_resolution = ParseResolution.new
  @parse_resolution.parse_exception = ParseException.find(params[:parse_exception])

  respond_to do |format|
    format.html # new.html.erb
    format.xml  { render :xml => @parse_resolution }
  end
end

到目前为止一切顺利,因为我可以访问ERB文件中的ParseException对象并显示其详细信息。

然而,当我按下“创建”按钮添加我的新ParseResolution对象时,save方法会抱怨我没有为它提供ParseException,这是一个必需的列。

我尝试使用hidden_​​field执行此操作:

<%= hidden_field(:parse_resolution, :parse_exception) %>

但是这只是将实际的ParseException对象转换为字符串:

<input id="parse_resolution_parse_exception" name="parse_resolution[parse_exception]" type="hidden" value="#&lt;ParseException:0x1108a8930&gt;" />

这显然不起作用。

好的,所以我再次尝试 不要讨厌Ruby on Rails的所有类似巫术的约定。有人请赐教我最好的办法去做我想做的事吗?

1 个答案:

答案 0 :(得分:2)

如果你想遵循良好做法,你应该这样做:

您对新建,创建,销毁操作的路径应如下所示:

parse_exceptions/:parse_exception_id/parse_resolutions/new
在routes.rb中

将会是:

  resources :parse_exceptions do
    resources :parse_resolutions
  end

然后你的新行动之路应该是这样的:

new_parse_exception_parse_resolution_path(@parse_exception)

(您还需要更改路径以在表单中创建操作)

然后在你的ParseResolutionsController中:

before_filter :load_parse_exception
.
def new
  @parse_resolution = @parse_exception.parse_resolutions.new
end

def create
  @parse_resolution = @parse_exception.parse_resolutions.new(params[:parse_collection]
  .
  .
end
private
def load_parse_exception
  @parse_exception = ParseException.find params[:parse_exception_id]
end