ruby-on-rails backbone.js

ruby on rails - Backbone.js and Rails-¿Cómo manejar params desde modelos Backbone?



ruby-on-rails (6)

En un controlador estándar de Rails, crearía un registro como este:

@user = User.new(params[:user])

Esto supone que los parámetros de formulario que entran están anidados.

He estado jugando con Backbone.js y noté que, de manera predeterminada, Backbone no anida los parámetros de la forma normal que tiene Rails, que en realidad es algo que esperaba. Entonces me pregunto qué debería hacer ...

¿Yo?

averiguar en el lado del servidor si se trata de una solicitud de Backbone al mirar acepta encabezados, etc. y manipular los params yo mismo para poder mantener mi código de controlador pequeño:

do_some_params_manipulation_with(params) @user = User.new(params[:user]) respond_to do |format| if @user.save format.html {redirect_to users_url} format.json {render :json => @user.to_json } end end

O bien, hago una instancia del objeto en cada rama que termina con código repetido, pero podría ser más fácil de mantener en el largo plazo ....

respond_to do |format| format.html do @user = User.new(params[:user]) if @user.save redirect_to users_url end end format.json do @user = User.new(params) # and rely on mass-assignment protection if @user.save render :json => @user.to_json end end end

o modifico mis modelos de Backbone.js anulando el método .toJSON (que no estoy del todo seguro de cómo hacerlo porque todavía no sé lo suficiente sobre Backbone.js) para que anide los params?

En esta situación, tengo acceso a ambos lados de la aplicación, pero estoy interesado en lo que otros están haciendo.


A partir de Rails 3.1 ahora hay un nuevo inicializador llamado wrap_parameters.rb que maneja este problema por defecto. El código que maneja este caso es:

# Disable root element in JSON by default. ActiveSupport.on_load(:active_record) do self.include_root_in_json = false end

¡Bada Bing!


Cabe señalar que si optas por la respuesta actualmente aceptada (parcheando a JSON en el nivel de modelo), también estás afectando la lectura. Tal vez eso es evidente, tal vez no. Pero tendrá mucho trabajo por hacer cuando renderice modelos / colecciones si pone este parche en efecto en una aplicación troncal. Por lo tanto, personalmente no lo usaría tal como está.



Es agradable cuando puede hacer coincidir los formularios generales de Rails y Backbone con respecto al nodo raíz. Es por eso que en mi última aplicación elegí anular el método toJSON de los modelos Backbone.

Podría anular el método global de JSON como lo sugirió Raimonds Simanovskis . Pero incluso el enfoque de la forma no DRY no es tan malo. Solo una línea de repetición para cada definición de modelo:

// Depends on Underscore.js User = Backbone.Model.extend({ toJSON: function() { return { user: _.clone( this.attributes ) } }, // Your other methods here });

Editar: muestra de código corregido. Perdón por los errores. Estaba traduciendo de CoffeeScript a JavaScript.


He hecho un pequeño truco para las solicitudes de guardar espacios de nombres en la propiedad model.name. Mono realiza parches a toJSON() durante la llamada sync() y restaura el método original para que pueda usarlo como siempre.

Lo he implementado en CoffeeScript.

Verifíquelo aquí


Si está utilizando la gema backbone-rails , parece que puede hacer

var User = Backbone.Model.extend({ paramRoot: ''user'' });

Alrededor de la línea 45 en github

Crédito PL J y flujo 7 en este link