Вопрос по ruby-on-rails, ajax, simple-form – Есть ли способ отправить запросы AJAX / JSON с Simple_form для Rails

6

С помощью стандартного Rails form_for я смог передать ajax-запросы через помощников select и collection_select как таковых:

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

Я не могу понять, как это сделать спростая форма

Ваш Ответ

5   ответов
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

Так должно быть:input_html => вместо:html =>
15

:input_html => {"data-remote" => true, "data-url" => "/yoururl", "data-type" => :json}
Я запутался в том, как это реализовать. Как выглядит полная строка кода? f.input: my_field: collection = & gt; ????
Для некоторых новых браузеров (2015 :)) вам нужно будет добавитьformat: :json для правильной работы формы, например:<%= simple_form_for(@object, html: { class: 'your_class', id: "#new'}}, url: your_resource_path(@object, format: :json), remote: true, authenticity_token: true, data: { type: 'json' }) do |f| %> # Code <%end%>
Благодарю. один дополнительный вопрос - как вы установили свой обратный вызов javascript для этого?
Я уверен, что"data-remote" => true отправляетjs запрос. Если вам нужно указать JSON-запрос, обязательно сделайте то, что вы предлагаете. Но это может быть нежелательно и не требуется, я не думаю. Nathan
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). Когда вы объявляете простоurl вместо этого он просто получит указанный URL.

6

потому что мне было трудно понять, как реализовать обратный вызов для этого. Я нашел эту статью очень полезной:http://www.simonecarletti.com/blog/2010/06/unobtrusive-javascript-in-rails-3/

Секрет в том, чтобы добавить атрибут данных HTML5, например,data-complete или (лучше) связатьajax:complete или жеajax:success обратные вызовы, предоставленные Rails для вашей формы (см. 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
)
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-хэши, но это должно работать и там.

Похожие вопросы