2012-04-21 6 views

Respuesta

14

Lo descubrí. Sólo tiene que añadir el siguiente:

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

gracias. una pregunta de seguimiento: ¿cómo estableciste la devolución de llamada de javascript para esto? – Blake

+1

Estoy confundido sobre cómo implementar esto. ¿Cómo se ve la línea completa de código? f.input: my_field: collection => ???? – SteveO7

+0

Para algunos navegadores nuevos (2015 :)) deberá agregar 'format:: json' para que el formulario funcione correctamente, como: ' <% = simple_form_for (@object, html: {class: 'your_class' , id: "#new '}}, url: ruta_de_resource (@object, formato:: json), remote: true, autentity_token: true, data: {type:' json '}) do | f |%> # Código <%end%> ' – Aleks

2

Parece que la forma válida de hacer esto ahora es:

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

que puede parecer un poco mejor con el rubí sintaxis 1.9 de hash como:

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

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

+0

Debe ser ': input_html =>' en lugar de ': html =>' – Matt

6

quería publicar un seguimiento relacionado, porque tenía cierta dificultad para calcular cómo implementar la devolución de llamada para esto. Encontré este artículo muy útil: http://www.simonecarletti.com/blog/2010/06/unobtrusive-javascript-in-rails-3/

El secreto está en agregar un atributo de datos HTML5, p. Ej. data-complete o (mejor) unir las ajax:complete o ajax:success devoluciones de llamada proporcionados por rieles a su formulario (ver 4. remoto JavaScript devoluciones de llamada en el artículo enlazado más arriba):

Desde el artículo: ejemplo

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 
) 
6

es mejor escribir así:

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

Cuando declara explícitamente data-url, primero seguirá el cálculo de ruta predeterminado, que en mi caso falló porque las rutas predeterminadas no existían (y no deberían existir, ya que estoy anulando la URL). Cuando declares solo url, solo tomará la url dada en su lugar.

0

La forma más sencilla de hacer esto que he encontrado, y por un ejemplo más completo, es:

En su opinión:

<%= 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 %> 

y en su controlador:

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 

En Rails 5 es aún más fácil en el controlador con el Jbuilder instalado para crear hashes json simples, pero esto debería funcionar allí también.

Cuestiones relacionadas