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

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 ему

4b9b3361

Ответ 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