Подтвердить что ты не робот

Backbone.js и Rails - Как обрабатывать параметры из моделей Backbone?

В стандартном контроллере Rails я бы создал такую ​​запись:

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

Это предполагает, что входящие в него параметры формы вложены.

Я играл с Backbone.js, и я заметил, что по умолчанию Backbone не устанавливает параметры так, как может выглядеть обычная форма Rails, что на самом деле я ожидал. Поэтому мне интересно, что я должен делать...

Я

рассчитывать на стороне сервера, если это запрос от Backbone, глядя на принимающие заголовки и т.д. и сам манипулировать параметрами, поэтому я могу сохранить небольшой код контроллера:

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

Или, я создаю экземпляр объекта в каждой ветке, который заканчивается повторным кодом, но может быть более удобным для обслуживания в конечном итоге....

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

или я могу изменить мои модели Backbone.js, переопределив метод .toJSON(который я не совсем уверен, как это сделать, потому что я еще недостаточно знаю о Backbone.js), так что он вставляет params?

В этой ситуации у меня есть доступ к обеим сторонам приложения, но меня интересует то, что делают другие.

4b9b3361

Ответ 1

Хорошо, когда вы можете иметь общие формы Rails и Backbone-формы в соответствии с корнем node. Поэтому в моем последнем приложении я решил переопределить метод todon для моделей Backbone.

Вы можете переопределить глобальный метод toJSON как предложил Раймондс Симановскис. Но даже подход, не основанный на DRY, не так уж плох. Только одна строка шаблона для каждого определения модели:

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

Изменить: Исправленный пример кода. Извините за ошибки, я переводил с CoffeeScript на JavaScript.

Ответ 2

Если вы используете драгоценный камень backbone-rails, похоже, что вы можете сделать

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

Вокруг строки 45 на github

Кредит PL J и поток 7 на этой ссылке

Ответ 3

Я немного взломал запросы на сохранение пространства имен в свойстве model.name. Это обезьяна исправляет toJSON() только при вызове sync() и восстанавливает оригинальный метод, поэтому вы можете использовать его как обычно.

Я реализовал его в CoffeeScript.

Проверьте здесь

Ответ 4

Следует отметить, что если вы выберете принятый в настоящее время ответ (исправление на JSON на уровне модели), вы также влияете на чтение. Может быть, это само собой разумеется, может быть, нет. Но при обработке моделей/коллекций у вас будет много работы, если вы включите этот патч в базовое приложение. Поэтому я лично не буду использовать его как есть.

Ответ 6

В Rails 3.1 теперь есть новый инициализатор с именем wrap_parameters.rb, который обрабатывает эту проблему по умолчанию. Код, обрабатывающий этот случай:

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

Bada bing!