【问题标题】:SyntaxError: unexpected POST_IF error RailsSyntaxError:意外的 POST_IF 错误 Rails
【发布时间】:2013-04-06 01:52:06
【问题描述】:

我在 app/assets/javascripts/ticket.js.coffee 中运行 jQuery 以获得特定视图。每次我访问该页面时,浏览器都会呈现此错误 - 在线任何地方都没有提及此错误。

(localhost:3000/Tickets/new):

SyntaxError: unexpected POST_IF

Extracted source (around line #6):

3: <head>
4:   <title>Ops2</title>
5:   <%= stylesheet_link_tag    "application", :media => "all" %>
6:   <%= javascript_include_tag "application" %>
7:   <%= csrf_meta_tags %>
8: </head>
9: <body>

抛出错误的页面文件 -

app/views/tickets/_form.html.erb

<%= form_for(@ticket) do |f| %>
<% if @ticket.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@ticket.errors.count, "error") %> prohibited this ticket from being saved:</h2>
<ul>
<% @ticket.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>

<div class="field">
<%= f.label :school_id %><br />
<%= f.collection_select :school_id, School.order(:name), :id, :name, include_blank: true%>
</div>

<div class="field">
<%= f.label :location_id %><br />
<%= f.grouped_collection_select :location_id, School.order(:name), :locations, :name, :id, :name, include_blank: true%>
</div>

<div class="actions">
<%= f.submit %>
</div>
<% end %>

app/assets/javascripts/application.js 包含:

//= require jquery
//= require jquery_ujs
//= require_tree .

带有 jQ​​uery 的咖啡脚本文件 -

app/assets/javascripts/tickets.js.coffee

$ ->
$('#ticket_location_id').parent().hide()
  locations = $('#ticket_location_id').html()
$('#ticket_school_id').change ->
  school = $('#ticket_school_id :selected').text()
  options = $(locations).filter("optgroup[label='#{school}']").html()
if options
$('#ticket_location_id').html(options)
$('#ticket_location_id').parent().show()
else
$('#ticket_location_id').empty
$('#ticket_location_id').parent().hide()

POST_IF 错误已通过在我的咖啡脚本中缩进 if / else 语句得到解决! (详见下面的答案)没有错误,页面加载!

【问题讨论】:

  • 你确定这就是你所有的咖啡脚本代码吗?将 //= require_tree . 替换为 //= require ticket,如果您仍然遇到同样的问题,请告诉我。您遇到的错误是咖啡脚本解析错误,如果这不起作用,请尝试删除文件tickets.js.coffee 以查看它是否有效,所以至少我们可以意识到问题出在文件tickets.js 中.coffee
  • 我支持删除 //= require_tree 。在过去,它给我带来了各种痛苦。最好将所有的 javascript 分到文件夹中,然后需要这些文件夹,然后使用 //= require_tree。
  • //= require ticket 替换 //= require_tree . 给了我同样的错误,没有变化。如果我删除 ticket.js.coffee 文件中的 jQuery,我的页面会正确加载。事实上,如果我删除 jQuery 中的 ifelse 语句,页面会加载但 jQuery 仍然没有运行。
  • 如果我分离我的 javascript,我将如何需要这些文件夹?我会将代码添加到每个页面还是添加到我的 application.js 文件中?
  • 请不要听信上面的劝告; require_tree 很好,你应该继续使用它。您的错误与您使用require_tree 完全无关。

标签: jquery ruby-on-rails


【解决方案1】:

您的if 语句缺少缩进。缩进在 CoffeeScript 中是至关重要的

这...

if options
$('#ticket_location_id').html(options)
$('#ticket_location_id').parent().show()
else
$('#ticket_location_id').empty
$('#ticket_location_id').parent().hide()

...需要这样,前导缩进不是可选的:

if options
  $('#ticket_location_id').html(options)
  $('#ticket_location_id').parent().show()
else
  $('#ticket_location_id').empty
  $('#ticket_location_id').parent().hide()

【讨论】:

  • 哇,谢谢!我在任何地方都没有找到!太好了,POST_IF 错误不再出现,所以我更近了一步,但现在它仍然没有运行我的 jQuery。有什么想法吗?
  • 我让它工作了!它一定是我的 jQuery 中带有空格和缩进的东西,也没有运行它。我不知道 Coffeescript 对空格如此挑剔。谢谢!
  • CoffeeScript 是all about 空格,代码行前的缩进程度非常重要。如果它们的主体没有缩进,你的 if 语句就不会做任何事情。当你没有像end}&lt;/tag&gt;这样的块结束时,你如何期望CoffeeScript知道哪些行与哪个语句一起使用?
  • 所以基本上使用 CoffeeScript 你可以用括号的问题来换取空格和缩进的问题。从来没有真正理解这有什么用。
  • @MaxHodges 这并不是 CoffeeScript 独有的。有许多非常流行的语言,其中前导空格是有意义的。至于它有什么用处,我可以客观地说它导致代码更短、更易读,但你的里程可能会有所不同。
猜你喜欢
  • 2014-04-22
  • 2014-04-17
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多