有没有办法使用simple_form for Rails提交ajax / json请求

时间:2012-04-21 00:46:19

标签: ruby-on-rails ajax simple-form

使用标准的Rails form_for,我能够通过select和collection_select助手传递ajax请求:

<%= address.collection_select :country, @countries, :id, :name, {:include_blank => false}, "data-remote" => true, "data-url" => "/ajax/states", "data-type" => :json  %>

我似乎无法弄清楚如何使用simple_form

执行此操作

5 个答案:

答案 0 :(得分:15)

想出来。你只需要添加这个:

:input_html => {"data-remote" => true, "data-url" => "/yoururl", "data-type" => :json}

答案 1 :(得分:6)

我想发布一个相关的跟进,因为我很难搞清楚如何为此实现回调。我发现这篇文章非常有用:http://www.simonecarletti.com/blog/2010/06/unobtrusive-javascript-in-rails-3/

秘诀是要添加HTML5数据属性,例如data-complete或(更好)将Rails提供的ajax:completeajax:success回调绑定到您的表单(请参阅上面链接的文章中的4.远程JavaScript回调):

来自文章:

jQuery(function($) {
  // create a convenient toggleLoading function
  var toggleLoading = function() { $("#loading").toggle() };

  $("#tool-form")
    .bind("ajax:loading",  toggleLoading)
    .bind("ajax:complete", toggleLoading)
    .bind("ajax:success", function(event, data, status, xhr) {
      $("#response").html(data);
    });
});

CoffeeScript示例:

$("#new_post").on("ajax:success", (e, data, status, xhr)->
  console.log data
)

答案 2 :(得分:6)

最好这样写:

= simple_form_for sample_result, url: reject_sample_result_path(sample_result), method: :post, remote: true, input_html: {multipart: true} do |f|

当您明确声明data-url时,它仍将首先执行默认路由计算,在我的情况下失败,因为默认路由不存在(并且不应该存在 - 因为我正在推翻网址)。当您声明url时,它将只取代给定的网址。

答案 3 :(得分:2)

现在看来这样做的有效方法是:

:remote => true, :html => { :data => { :url => '/yoururl', :type => :json } }

使用ruby 1.9哈希语法可能看起来好一点:

remote: true, html: { data: { url: '/yoururl', type: :json } }

https://github.com/plataformatec/simple_form/wiki/HTML5-Attributes

答案 4 :(得分:1)

我找到的最简单的方法就是:

在您看来:

<%= simple_form_for :my_object, url: my_objects_path(format: :json), remote: true do |f| %>
  <%= f.error_notification %>
  <%= f.input :an_attribute %>
  <%= f.submit %>
<% end %>

并在您的控制器中:

def create
  @my_object = MyObject.new(my_object_params)
  if @my_object.save
    respond_to do |format|
      format.html { redirect_to @my_object, notice: "Saved" }
      format.json { render json: @my_object, location: my_object_url(@object), status: :created }
    end
  else
    respond_to do |format|
      format.html { render :edit }
      format.json {render json: @my_object, status: :unprocessable_entity }
    end
  end
end

在Rails 5中,安装Jbuilder的控制器更容易创建简单的json哈希值,但这也适用于此。