【问题标题】:Rails nested form using file_field element使用 file_field 元素的 Rails 嵌套表单
【发布时间】:2010-02-10 14:39:06
【问题描述】:

我正在使用 Railscast 197 中的代码使用 jQuery 创建嵌套表单。我面临的挑战是嵌套模型使用 file_field 元素,因此在查看 edit 视图时,我只看到一个空的 file_field 元素列表。当用户查看 edit 视图时,我可以告诉 rails 显示其他内容(如禁用的 text_field),但在查看 new 视图时显示 file_field 吗?

这是我正在使用的部分:

<div class="fields">
    <p>
        <%= f.label :document_type %>
        <%= f.select :document_type, XmlDocument::SOURCES %>
    </p>
    <p>
        <%= f.file_field :inputfile, :class => 'text' %>
        <%= f.hidden_field(:_delete) + link_to('Remove', "javascript:void(0)", :class => "remove_child remove-xmldoc") %>
    </p>
</div>

这是添加它的 jQuery(从 Railscast 稍微修改以在显示部分时添加效果):

$('form a.add_child').click(function() {
    var assoc   = $(this).attr('data-association');
    var content = $('#' + assoc + '_fields_template').html();
    var regexp  = new RegExp('new_' + assoc, 'g');
    var new_id  = new Date().getTime();

    var newElements = jQuery(content.replace(regexp, new_id)).hide();
    $(this).parent().before(newElements).prev().slideFadeToggle();

    return false;
});

但在我的 _form 部分中,我有:

<div id="xml_documents">
    <%= label_tag 'XML Documents' %>
    <% form.fields_for :xml_documents do |stream_xml_document_form| %>
    <%= render :partial => "xml_document", :locals => {:f => stream_xml_document_form} %>
    <% end %>

    <p><%= link_to('Add XML Document', "javascript:void(0)", :class => "add_child add-xmldoc", :"data-association" => :xml_documents) %></p>
    <%= new_child_fields_template(form, :xml_documents) %>
</div>

这就是添加部分的原因,我猜在这里的某个地方我需要有某种条件,告诉rails是否已经创建了对象,以呈现不同的部分..任何人都有任何想法至于我怎样才能做到这一点?

【问题讨论】:

    标签: jquery ruby-on-rails partial-views nested-forms


    【解决方案1】:

    区分“新建”和“编辑”操作的最简单方法是检查 form.object.new_record?这将为“新”操作返回 true,为“编辑”操作返回 false。

    所以你可以这样做

    <%= f.file_field :inputfile, :class => 'text' if f.object.new_record? %>
    

    【讨论】:

    • 我被淹没了,让我看看我能不能让它工作,什么是“对象”,rails 知道这是什么,或者你是否引用了我所说的任何对象..跨度>
    • 如果您使用 form_for 助手,即“form_for @post do |form|”,那么您可以通过调用“form.object”来访问@post 对象。
    • 抱歉,szimek 花了这么长时间,但您的解决方案有效,感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多