渲染部分会导致语法错误

时间:2014-06-08 03:11:44

标签: ruby-on-rails syntax-error render partial

目前使用以下railscast http://railscasts.com/episodes/196-nested-model-form-revised

处理嵌套表单

我有一个机会模型,

class Opportunity < ActiveRecord::Base
    has_many :headings
    accepts_nested_attributes_for :headings
end

标题模型

class Heading < ActiveRecord::Base
    belongs_to :opportunity
    has_many :subheadings
    accepts_nested_attributes_for :subheadings
end

和一个副标题模型

class Subheading < ActiveRecord::Base
    belongs_to :heading
end

现在我正在研究机会模型新行动的观点。

<h1>Add an opportunity</h1>
<%= form_for(@opportunity, :html => {:role => 'form'}) do |f| %>
    <%= f.fields_for :headings do |builder| %>
        <%= render 'heading_fields', f: builder %>
    <% end %>
    <%= link_to_add_fields "Add heading", f, :headings %>
    <%= f.submit %>
<% end %>

_heading_fields.html.erb partial:

<fieldset>
    <%= f.label :title, "Heading" %>
    <%= f.text_field :title %>
    <%= f.hidden_field :_destroy %>
    <%= link_to "Remove section", '#', class: "remove_fields" %>
    <%= link_to_add_fields "Add section", f, :subheadings %>
</fieldset>

最后是应用程序助手中的link_to_add_fields方法:

def link_to_add_fields(name, f, association)
    new_object = f.object.send(association).klass.new
    id = new_object.object_id
    fields = f.fields_for(association, new_object, child_index: id) do |builder|
        render(association.to_s.singularize + "_fields", f: builder)
    end
    link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("\n", "")})
end

现在我在link_to_add_fields函数中收到以下渲染调用错误:

syntax error, unexpected tIDENTIFIER, expecting keyword_end

它似乎与link_to_add_fields方法中呈现的部分名称中的下划线有关,因为当下划线不存在时它会消失。

非常感谢解决这个问题的任何帮助!

2 个答案:

答案 0 :(得分:1)

<强>调试

正如评论中所提到的,你基本上会遇到关闭循环的问题--Rails期待end调用,但你已经设置了一个标识符来代替。

看了你的代码,我看不出问题出在哪里,所以我会给你一些关于我如何调试它的细节:

  

我会删除任何我认为会导致的元素   问题,直到我开始工作

例如,我首先用一段演示内容替换def link_to_add_fields(name, f, association)

def link_to_add_fields(name, f, association)
    "test"
end

如果这输出正确的字符串,则表示错误在此方法内(我无论如何都在猜测)。如果是这种情况,我会尝试这个:

def link_to_add_fields(name, f, association)
    new_object = f.object.send(association).klass.new
    id = new_object.object_id
    fields = "test"
    link_to(name, '#', class: "add_fields", data: {id: id, fields: fields})
end

如果此方法有效,则表示问题可能与您正在使用的f.fields_for循环有关。虽然这只是我的猜测,但它基本上就是我调试的方式 - 按顺序删除它直到实际工作


<强>字段

如果您希望动态地向表单添加字段,您可能希望使用cocoon gem。您使用的Railscast首先有点过时,只允许您在表单中添加单个字段

“正确”的方法是使用ajax方法,I detail here

我找到了一个非常好的网站,它向您展示了如何做到这一点,但是the site已经离线了。无论如何,我会在这里为你解释一下:

#config/routes.rb
resources :controller do
   collection do
      get :add_field
   end
end

这为您提供了将ajax请求发送到:

的路由

<强>控制器

#app/views/controller/form.html.erb
<%= form_for @model do |f| %>
   <%= render partial: "fields", locals: { builder: f } %>
   <%= link_to "Add Field", controller_add_field_path, id: "add_field", remote: true %>
   <%= f.submit "test" %>
<% end %>

#app/views/controllers/your_controller.rb
Class YourController < ActiveRecord::Base
   def add_field
      @model = Model.new
      @model.association.build
      render "add_field", layout: false
   end
end

<强>视图

现在您需要使用add_field部分

呈现fields_for视图
#app/views/controller/_form.html.erb
<%= form_for @model do |f| %>
    <%= render partial: "fields", locals: { builder: f } %>
<% end %>


#app/views/controller/_fields.html.erb
<%= f.fields_for :association, child_index: Time.now.to_i do |a| %>
    <%= a.text_feld :your_fields %>
<% end %>

<强> JQuery的

您需要做的就是创建一种获取新字段的方法:

#app/assets/javascripts/application.js.coffee
$ ->
  $(document).on "ajax:success", "#add_field", (data) ->
       el_to_add = $(data).html()
       $('#new_form').append(el_to_add)

答案 1 :(得分:0)

我能够使用https://github.com/nathanvda/cocoon获得动态表单字段 出于某种原因,rBates视频已过时用于rails 4. +,Cocoon能够修复,因为我花了调试但是在Vain中。 谢谢Rick Peck。