在Rails中用json做ajax的惯用法?

时间:2013-02-15 13:34:32

标签: ruby-on-rails ajax ruby-on-rails-3 json ujs

Codeschool's rails课程给出了下面的代码,用json(format.json)做ajax。为什么代码与使用不显眼的javascript(format.js)进行ajax的方式有如此不同?

具体来说,我注意到下面的代码完全避免了UJS,并且在remote: true中没有使用form_for。这与在remote: true中使用form_for的不显眼的javascript方法非常不同。

为什么不使用json为ajax建议remote: true?我原以为json的ajax会使用remote: true并且有一些方法让客户端javascript将success函数注册到UJS,以便服务器的响应被UJS解释为json数据并传递给success函数而不是UJS尝试像在不显眼的javascript方法中那样执行javascript。

使用json进行ajax的方法是否比下面更好?

/views/zombies/show.html.erb

<div id="custom_phase2">
  <%= form_for @zombie, url: custom_decomp_zombie_path(@zombie) do |f| %>
    <%= f.text_field :decomp %>
    <%= f.submit "Set" %>
  <% end %>
</div>


/app/assets/javascripts/zombies.js.coffee

$(document).ready ->
  $('div#custom_phase2 form').submit (event) ->
    event.preventDefault()

    url = $(this).attr('action')
    custom_decomp = $('div#custom_phase2 #zombie_decomp').val()

    $.ajax
      type: 'put'
      url: url
      data: { zombie: { decomp: custom_decomp } }
      dataType: 'json'
      success: (json) ->
        $('#decomp').text(json.decomp).effect('highlight')
        $('div#custom_phase2').fadeOut() if json.decomp == "Dead (again)"

1 个答案:

答案 0 :(得分:0)

您可以使用 remote_form_for 帮助程序:

/views/zombies/show.html.erb

<div id="custom_phase2">
  <%= remote_form_for @zombie, url: custom_decomp_zombie_path(@zombie), :update => {:success => "form", :failure => "errors"} do |f| %>
    <%= f.text_field :decomp %>
    <%= f.submit "Set" %>
  <% end %>
</div>

这里“form”是将在sucess上更新的元素的id,“errors”是元素的id,如果有错误将会更新。

参考文献:herehere