从HTML视图在ActiveRecord模型上设置值数组

时间:2009-08-12 22:21:07

标签: javascript ruby-on-rails ruby activerecord

我需要有一个能够更新模型上的数组属性的视图,以便我可以在视图上动态添加内容以便能够添加它。这甚至有意义吗?

基本上Foo有网址。所以在DB我只有一个文本数据类型,我想存储逗号分隔的url列表,我覆盖默认的AR setter和getter所以我可以分配一个数组,并获取值的数组,它照顾加入和分裂。

我迷失的是如何最好地观察。我最初需要一个文本字段,但是然后添加另一个url链接以在另一个文本字段上添加另一个url,另一个等等。

这样做是否有'轨道',还是我必须自己滚动?

2 个答案:

答案 0 :(得分:3)

对于表单字段的动态添加,确实没有特定的“Rails方式”来执行它。使用jQuery或Prototype滚动自己的Javascript并不困难。

在您看来:

<div id="url_list">
  <%= render :partial => "url_form", :collection => @my.urls %>
</div>

<%= button_to_function 'Add' { |page| page.insert_html :bottom, :url_list, :partial => "url_form", :object => Url.new } %>

此代码利用Rails视图助手并假设您使用的是Prototype。它也不考虑从列表中删除URL。我怀疑它的工作方式与书面文字完全一致,但我希望你能对这个问题有所了解。我建议的立即改进是使JavaScript不引人注目。

Complex Forms Railscasts并不专门针对这个问题,但Ryan确实包含了动态添加表单,这是一个很好的例子。

祝你好运!

答案 1 :(得分:1)

基本上,你想要最终发生的是@foo.urls = params[:urls],其中params[:urls]是一个数组,而#urls= setter足够智能来处理一个数组,是吗?

我无法就这个具体案例的个人经验发言,但这是我会尝试的......

首先,在模型上使用serialize。例如,serialize :urls, Array - 听起来你已经有了一个有效的getter和setter,但重用ActiveRecord提供的东西总是很好。

接下来,在您的观看中,这一切都取决于您如何命名文本字段。如果根据约定命名它们,Rails会将参数解析为数组。要遵循此约定,您的文本字段名称需要类似foo[urls][]之类的内容。您可以简单地使用text_field_tag "foo[urls][]"f.text_field_tag "urls[]"(尽管我无法回想起后者是否有效 - 试一试)。

当您的文本字段标记被正确命名时,其余部分应该很好地从那里开始。您将在params[:foo][:urls]中添加一个数组,并将params传递给Foo.newFoo.create@foo.update_attributes,这样做会做正确的事。

(原谅上面语法中的任何失误,这都是我的头脑。)