【问题标题】:link_to_add_fields / unobtrusive javascript rails 4link_to_add_fields / 不显眼的 javascript rails 4
【发布时间】:2014-05-21 08:22:22
【问题描述】:

我知道有一些关于 railscast 嵌套表单的线程......并且 link_to_add_fields 在 rails 4 中不再正常工作,因为关于不引人注目的 js 的变化。 有人可以帮助我理解并告诉我我必须改变什么才能让我的嵌套表单工作吗?我正在尝试“重建”:complex form,但他使用的是 rails 3 而我是 rails 4。 我确实收到以下错误:

undefined method `link_to_function' for

在 _form.html.erb 中:

<%= link_to_add_fields("Add a Contact", f, :contacts, :class => "btn btn-primary", :title => "Add a new Contact") %>

我的 application_helper.rb

def link_to_add_fields(name, f, association, options = {})
new_object = f.object.class.reflect_on_association(association).klass.new
fields = f.fields_for(association, new_object, :child_index => "new_#{ association }", :onsubmit => "return $(this.)validate();") do |builder|
  render(association.to_s.singularize + "_fields", :f => builder)
end

link_to_function(name, "add_fields(this, \"#{ association }\", \"#{ escape_javascript(fields) }\")", options)

结束 结束

谢谢!

【问题讨论】:

    标签: javascript jquery ruby-on-rails-4 nested-forms


    【解决方案1】:

    在 Rails 4.1 中不推荐使用 link_to_function,建议使用 Unobtrusive JavaScript。

    这是我的建议:

    使用提供的 jQuery 代码:

    function add_fields(link, association, content) {  
        var new_id = new Date().getTime();  
        var regexp = new RegExp("new_" + association, "g");  
        $(link).parent().before(content.replace(regexp, new_id));  
    }
    

    在你的表格中:

    <%= link_to_add_fields "Add a Contact", f, :contacts, "btn btn-primary", "Add a new Contact" %>
    

    然后在 application_helper 中:

    def link_to_add_fields(name, f, association, cssClass, title)  
      new_object = f.object.class.reflect_on_association(association).klass.new  
      fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|  
        render(association.to_s.singularize + "_fields", :f => builder)  
      end  
      link_to name, "#", :onclick => h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"), :class => cssClass, :title => title 
    end  
    

    【讨论】:

      【解决方案2】:

      我修改了 Mavis 的代码 - 特别是 link_to 函数(忘记添加 remote: true)

      应用程序.js

      function add_fields(link, association, content) {  
          var new_id = new Date().getTime();  
          var regexp = new RegExp("new_" + association, "g");  
          $(link).parent().before(content.replace(regexp, new_id));  
      }
      

      表格代码:

      <%= link_to_add_fields "Add a Contact", f, :contacts, "btn btn-primary", "Add a new Contact" %>
      

      这是对 Mavis 代码的唯一更改:

      application_helper.rb

          def link_to_add_fields(name, f, association, cssClass, title)  
        new_object = f.object.class.reflect_on_association(association).klass.new  
        fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|  
          render(association.to_s.singularize + "_fields", :f => builder)  
        end  
        link_to name, "#", :onclick => h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"), class: cssClass, title: title, remote: true 
      end  
      

      【讨论】:

        【解决方案3】:

        我假设你是从 rails cast 剧集 http://railscasts.com/episodes/197-nested-model-form-part-2 制作的这个助手。

        在您的 application_helper.rb 中,您已经定义了 link_to_add_fields。大概是这样的。

        def link_to_add_fields(name, f, association)
        
        change it to this
        
        def link_to_add_fields(name, f, association, locals={})
        
        Then on the return statement.
        
        link_to_function(name, "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")", class: locals[:class])
        

        最后,像这样使用你的新方法

        <%= link_to_add_fields "Add A Present", f, :presents, class: "btn btn-mini btn-info" %>
        

        【讨论】:

        • 谢谢。我试过了,但错误(未定义的方法......)仍然出现......如果我把整行拿出来,表格就会像它假设的那样显示。在 rails 3.2.9 中它完全没有问题......
        猜你喜欢
        • 2011-03-31
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 2011-06-10
        • 2013-04-05
        • 1970-01-01
        • 2013-10-14
        • 2012-02-22
        相关资源
        最近更新 更多