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
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.
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
Annonce nouvelle avant d'ajouter params.permit!
def create
params.permit!
@ad = Ad.new(params[:ad])
@ad.save
end
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