Rails 4 неразрешенных параметра, которые должны быть разрешены

Я немного застрял с этим. Я уверен, что это просто, но я все еще не могу понять это.

Вот мой метод разрешения:

def post_params
  params.require(:post).permit(:char_id, :text).merge!(topic_id:params[:topic_id], user_id: current_user.id, ip: request.remote_ip)
end

Вот метод обновления контроллера, на который направляется запрос:

def update
  @post.update(post_params)
  respond_to do |format|
    format.html { redirect to  }
    format.json { render partial: "post", locals: {post:@post} }
  end
end

Вот хэш параметров, который приходит с запросом.
Мне нужно получить что-то вот так.

И все же, когда я смотрю в консоль, я вижу это:

Unpermitted parameters: id, text, char_id, ip, show_text, posted_at, char, editable, deletable, commentable, user

Что-то работает не так или я что-то пропустил?


person Almaron    schedule 29.06.2014    source источник
comment
можете ли вы опубликовать полный код с полными журналами того, какие параметры отправляются? Кроме того, что вы ожидаете, потому что этот метод разрешения довольно тупой.   -  person sevenseacat    schedule 29.06.2014
comment
Я связал суть с полным хешем параметров, который я получаю.   -  person Almaron    schedule 29.06.2014
comment
@sevenseacat Я обновил вопрос, указав код метода контроллера. Это довольно просто, как видите.   -  person Almaron    schedule 29.06.2014
comment
если бы это было просто, я бы не просил вас о дополнительной информации. И я до сих пор не знаю, что вы ожидаете получить от метода разрешения.   -  person sevenseacat    schedule 29.06.2014
comment
Обновлено с другой сутью.   -  person Almaron    schedule 29.06.2014


Ответы (2)


Я считаю, что вы близки, попробуйте изменить свой метод post_params, чтобы он выглядел так:

def post_params
  params.permit(:topic_id)
  params.require(:post).permit(:text, :char => [:id]).merge({ip: request.remote_ip, user: current_user})
end

Большая разница в том, что мы передаем merge хэш, но также указываем, что мы хотим от :char, который вложен внутри :post, а также вносим в белый список :topic_id (который не является частью :post).

person jtperreault    schedule 29.06.2014
comment
Спасибо, это сработало. За исключением того, что мне действительно не нужна эта вложенность :char. Мне нужен :char_id, который явно входит в post. - person Almaron; 30.06.2014
comment
@Almaron Если :char_id находится внутри :post, вы сможете заменить :char => [:id] только на :char_id и все будет готово. - person jtperreault; 30.06.2014

Я думаю, что проблема в слиянии. Это не в том месте.

То, как вы это делаете, слияние действует на объект params, который является результатом

params.require(:post).permit(:char_id, :text)

Попробуйте это вместо этого:

def post_params
  params.require(:post).merge(user_id: current_user.id, ip: request.remote_ip)).permit({:char_id, :text, topic_id, :user_id, :ip}
end
person ReggieB    schedule 29.06.2014
comment
пробовал ставить слияние перед разрешением, но не получилось. тоже пытался их разделить, тоже не получилось. - person Almaron; 29.06.2014