【问题标题】:Rendering partial results in syntax error渲染部分导致语法错误
【发布时间】:2014-10-03 15:22:24
【问题描述】:

目前正在使用以下 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 部分:

<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 方法中呈现的部分名称中的下划线有关,因为当下划线不存在时它会消失。

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

【问题讨论】:

  • 你能粘贴完整的错误吗? syntax error, unexpected tIDENTIFIER, expecting keyword_end这种类型的错误通常发生在你没有正确关闭循环时

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


【解决方案1】:

调试

正如 cmets 中所提到的,您基本上会遇到关闭循环的问题 - 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)

【讨论】:

  • 我已经解决了这个问题!经过大量工作,我找到了罪魁祸首。我有一个嵌入的 ruby​​ 注释,这里没有显示,它破坏了整个事情。了解了另一个小陷阱,并在此过程中学到了很多东西。非常感谢帮忙。非常感谢。
  • 不错!没问题 - 也许您会想要接受以确保人们知道答案是有帮助的?
  • 完全忘记了。道歉。 :)
【解决方案2】:

我能够使用https://github.com/nathanvda/cocoon 实现动态表单字段 出于某种原因,rBates 视频对于 rails 4.+ 来说已经过时了,Cocoon 能够修复我曾经如何调试但徒劳无功。 谢谢里克·派克。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多