web-dev-qa-db-fra.com

rails 4 ActiveModel :: ForbiddenAttributesError

J'essaye de faire une simple création en utilisant Rails 4

mon contrôleur:

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

forme:

<%= 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 %>

de mon point de vue c'est ok mais j'ai eu cette erreur ActiveModel::ForbiddenAttributesError ce que je fais mal?

MISE À JOUR:

mon problème passait une valeur incorrecte à une nouvelle méthode dans l'action de création: la solution était de passer ad_params à elle

25
Maki

Je suggère de sauter la mise à jour pour que votre code fonctionne

Votre problème n'est probablement pas dans votre manette, mais dans votre modèle: vérifiez que vos attributs sont accessibles avec la balise de suivi

attr_accessible :title, :price, :description

Rails 4 le fait un peu différent de ce que je comprends, cette précédente réponse SO a fourni de bons liens: Comment attr_accessible est-il utilisé dans Rails 4?

Vous devez utiliser attr_accessible/Strong Params chaque fois que vous accédez à des éléments de la base de données.

Mise à jour

Oh pour être jeune, et ne pas réaliser Rails 4 utilise des paramètres forts. Je comprends que l'OP a déjà résolu son problème d'origine, mais je vais le corriger pour qu'il puisse être utilisé comme bonne réponse.

Ce serait un problème au niveau du contrôleur, car Rails 4 vous oblige à ajouter des attributs à la liste blanche dans le contrôleur.

Ad.create(params[:ad].require(:ad).permit(:title, :price, :description))

La plupart du temps, vous autoriserez les mêmes paramètres dans l'action de création et de mise à jour, il est donc préférable de le déplacer dans sa propre méthode dans le contrôleur.

Ad.create(ad_params)
def ad_params
  params.require(:ad).permit(:title, :price, :description)
end

Comme OP l'a souligné dans son commentaire, la méthode allowed_params qu'il a mise en œuvre n'était pas appelée à partir du permis.

40
Noah Koch

J'ai également fait face au même problème et travaillé pendant 6 heures, et j'ai finalement trouvé la solution.

Essayez ce code, il vous aidera! Dans Rails 4, cette fonctionnalité est ajoutée pour gérer la création de différentes manières.

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
31
user2836838

Annonce nouvelle avant d'ajouter params.permit!

   def create
     params.permit!
     @ad = Ad.new(params[:ad])    
     @ad.save
   end
6
田咖啡

Le vôtre devrait ressembler à ceci:

def new
    @ad = Ad.new(params[:ad].permit(:title, :price, :description))
end

Le mien ressemble à ceci:

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
1
Lesly Revenge