Rails 4 ActiveModel:: ForbiddenAttributesError
Я пытаюсь сделать простое создание с использованием рельсов 4
мой контроллер:
class AdsController < ApplicationController
def new
@ad = Ad.new
end
def create
@ad = Ad.new(params[:ad])
@ad.save
end
def show
@ad = Ad.find(params[:id])
end
def index
@ads = Ad.first(3)
end
private
def ad_params
params.require(:ad).permit(:title, :price, :description)
end
end
форма:
<%= form_for @ad do |p| %>
<p><%= p.text_field :title %></p>
<p><%= p.text_field :price %></p>
<p><%= p.text_area :description %></p>
<p><%= p.submit %></p>
<% end %>
с моей точки зрения это нормально, но я получил эту ошибку ActiveModel::ForbiddenAttributesError
что я делаю неправильно?
UPDATE:
моя проблема передавала неправильное значение новому методу в action action: решение заключалось в том, чтобы передать ad_params
ему
Ответы
Ответ 1
Я предлагаю пропустить обновление, чтобы ваш код работал
Ваша проблема, вероятно, не в вашем контроллере, но ваша модель:
Проверьте, доступны ли ваши атрибуты с помощью тега
attr_accessible :title, :price, :description
Rails 4 делает это немного отличным от того, что я понимаю, этот предыдущий SO ответ предоставил несколько хороших ссылок:
Как attr_accessible используется в Rails 4?
Вам нужно использовать attr_accessible/Strong Params всякий раз, когда вы обращаетесь к вещам из базы данных.
Обновление
О, чтобы быть молодым, и не осознавать, что Rails 4 использует Strong Params. Я понимаю, что ОП уже решил свою первоначальную проблему, но я исправлю это, чтобы он мог быть использован в качестве правильного ответа.
Это будет проблемой уровня контроллера, так как Rails 4 потребует от вас атрибутов whitelist в контроллере.
Ad.create(params[:ad].require(:ad).permit(:title, :price, :description))
В большинстве случаев вы будете разрешать одни и те же параметры в действии создания и обновления, поэтому лучше всего переместить его в свой собственный метод внутри контроллера.
Ad.create(ad_params)
def ad_params
params.require(:ad).permit(:title, :price, :description)
end
Как указывал OP в своем комментарии, метод allowed_params, который он реализовал, не вызывается из разрешения.
Ответ 2
Я также столкнулся с такой же проблемой и работал в течение 6 часов, и, наконец, получил решение.
Попробуйте этот код, это поможет вам!
В Rails 4 эта функция добавляется, чтобы иметь дело с созданием по-разному.
def new
@ad = Ad.new
end
def create
@ad = Ad.create(ad_params)
@ad.save
end
private
def ad_params
params.require(:ad).permit(:title, :price, :description)
end
Ответ 3
Объявление new перед добавлением params.permit!
def create
params.permit!
@ad = Ad.new(params[:ad])
@ad.save
end
Ответ 4
Ваше должно выглядеть так:
def new
@ad = Ad.new(params[:ad].permit(:title, :price, :description))
end
Моя выглядит следующим образом:
def create
@about = About.new(params[:about].permit(:introduction, :description))
respond_to do |format|
if @about.save
format.html { redirect_to @about, notice: 'About was successfully created.' }
format.json { render action: 'show', status: :created, location: @about }
else
format.html { render action: 'new' }
format.json { render json: @about.errors, status: :unprocessable_entity }
end
end
end