在Rails中的remote_function中如何传递表单构建器?

8
我有一个选择框,当更改时,我需要获取值并通过远程函数从数据库中获取一些字段名称,然后根据所选选择框中的选项在表单下方生成这些字段。
问题是这些字段在 f.form_for 中,因此使用了 formbuilder f。因此,当我通过控制器中的 ajax 渲染部分时,由于没有对本地表单构建器 f 的引用,我会收到错误。
是否有人知道如何或者是否可以获取对表单构建器的引用,或者是否可以在远程函数调用中传递它,然后将其传递给我的局部变量?
非常感谢,任何帮助都将是很棒的,因为我已经陷入困境很长时间了!
谢谢 Rick

DONATO:被标记为20分的答案对于嵌套表单无效,而且我无法取消我的点赞,所以我在这里留下评论供将来参考。 - Daniel Viglione
在2009年12月17日回答的那个是更好的答案。 - Daniel Viglione
4个回答

26

我曾经遇到过同样的问题,我的解决方案是为同一对象创建另一个表单生成器,并将其传递给局部文件。

remote_action.js.erb:

'<%= form_for(@object) do |ff| %>'
   $('#some_div').html("<%= j render(partial: 'some_partial', locals: {f: ff}) %>"
'<% end %>' 

form_for标签中使用单引号很重要,否则会出现javascript_escape问题。


1
太好了,运行正常。部分渲染缺少闭合括号,我不得不在第一行删除“/”。 - Mark Kenny
一旦我意识到你在“@object”中指的是控制器中的某个实例变量(用于AJAX调用的那个)时,这对我很有用... 在我的情况下是@property(等等...)。我的代码看起来像这样:<EDIT已删除粘贴代码时创建的混乱,并将其放入答案帖子中> - veca
嗨Uri,我遇到了类似的问题。唯一的区别是我正在处理嵌套字段,并使用fields_for而不是form_for。因此,我必须做类似于f.fields_for:accessories的事情,其中f是车辆模型的form_builder对象。关联如下:Vehicle has_many accessories。请在这种情况下提供帮助。先行致谢。 - cvibha
非常聪明的方法通过JS动态渲染表单字段。感谢这个提示。工作得很好。 - Goldnuggets
我赞同了这个答案,但在尝试嵌套表单后,它根本不起作用。 - Daniel Viglione

10
我会简单重写您的部分内容,不使用f.表单助手。
请执行以下操作:
<%= text_field :object_name, :method_name %>

替代方案:

<%= f.text_field :method_name %>

这回答了我的问题:http://stackoverflow.com/questions/8821613/rails-lookup-table-with-dynamic-nested-forms - Karl
嗨,卡尔,你链接的问题不见了。你还记得它是什么吗?我有完全相同的问题。谢谢! - Uri Klar

4

我正在做类似于Uri Klar所建议的事情,但不需要将表单元素作为字符串传回客户端,因为它们是不必要的:

# create a form helper 'f' and store it in the variable form_helper.

<% form_helper = nil %> 
<% form_for @object, url: '' do |f| %>
<%   form_helper = f %>
<% end %>

# pass form_helper to the form partial

$('#element').html('<%= j render "form_element", f: form_helper %>');

注意第一行的form_helper = nil是为了将变量的作用域设置为超出表单块的范围。
我认为这是一个更好的方法,因为它不会让客户端接触到我们的内部工作,而是仅保留在服务器端。

0

这个片段无法很好地适应不同答案的评论... 它有助于说明部分用于嵌套模型的情况,并在远程方法/操作中引用它。 它还说明了我的@object的字面解释是错误的:

'<%= form_for([@property.agency,@property]) do |parent_form| %> ' '<%= parent_form.fields_for :address do |f| %>' $('#property_addresses').append("<%= j render(partial: 'common_partials/address', locals: {parent_form: f}) %>") '<% end %>' '<% end %>'

请注意,这是一个@property,嵌套在@property.agency下:我们在form_for下嵌套了fields_for。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接