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á.
En una de las respuestas a la asignación de masa de Rails y Backbone.js , se menciona el parche https://gist.github.com/719080 que creo que hará lo que necesites.
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.