Сохранить модель Rails из параметров контроллера?

Я попробовал User.create(params), но это говорит о том, что «контроллер» и «действие» не могут быть назначены массово. Я мог бы исключить эти свойства, но есть ли более простой способ упорядочить нужные мне свойства?

Некоторые примеры, похоже, указывают на то, что я могу использовать params[:user], но если я хочу, чтобы сообщение было просто объектом пользователя, params[:user] выглядит как ноль.

Итак, я публикую с {имя пользователя: 'бла', пароль: 'бла'}, и имя пользователя и пароль находятся в параметрах, но не params[:user].

class UsersController < ApplicationController
  def create
    user = User.create(params[:user])
    if user.save
      render :json => user, :status => :created
    else
      logger.error user.errors
      render :json => {:status => :error, :errors => user.errors}, :status => :bad_request
    end
  end
end

person Stefan Kendall    schedule 20.12.2012    source источник
comment
stackoverflow.com/questions/7376659 /   -  person MrYoshiji    schedule 20.12.2012
comment
Это даже отдаленно не тот же самый вопрос.   -  person Stefan Kendall    schedule 20.12.2012
comment
если вы сделаете простой вывод params, вы увидите, что у него разные параметры, такие как controller и action. User.create(params) попытается создать пользователя и присвоить ему атрибуты params. Поскольку ваши параметры имеют значения, не являющиеся атрибутами (действие, контроллер, фиксация, utf и т. д.), они не будут работать и вызовут ошибку массового назначения.   -  person MrYoshiji    schedule 20.12.2012


Ответы (2)


Попробуйте User.create(request.request_parameters) или User.create(JSON.parse(request.body.read)).

person DNNX    schedule 20.12.2012

В проектах Rails существует соглашение, согласно которому элементы формы именуются определенным образом (использование хелперов формы делает это за вас автоматически):

<input type='text' name='user[username]'>
<input type='text' name='user[username]'>

Когда они отправляются в контроллер, они преобразуются в хеш параметров:

params = {
  :user => {
    :username => 'whatever',
    :password => 'somepass'
  }
}

Из-за того, как работает маршрутизация, пары ключ-значение для контроллера, действия, идентификатора (если применимо) или любых пользовательских частей маршрута добавляются к этому хэшу параметров.

params.merge!({
  :controller => 'users',
  :action     => 'create'
})

Если params[:user] для вас равно нулю, вам может потребоваться изменить форму, чтобы она соответствовала соглашению.

person Unixmonkey    schedule 20.12.2012