2013-07-25 15 views
25

provo a fare un semplice creare usando le rotaie 4rotaie 4 ActiveModel :: ForbiddenAttributesError

mio controller:

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 

forma:

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

dal mio punto di vista è ok, ma Ho ricevuto questo errore ActiveModel::ForbiddenAttributesError cosa sto facendo di sbagliato?

UPDATE:

Il mio problema era che passa il valore sbagliato nuovo metodo nel creare azioni: la soluzione doveva passare ad_params ad esso

risposta

39

Vorrei suggerire saltare per aggiornare in modo che il codice funziona

Probabilmente il tuo problema non si trova nel tuo controller, ma il tuo modello: Controlla che i tuoi attributi siano accessibili con il tag seguente

attr_accessible :title, :price, :description 

Rails 4 fa fare un po 'diverso da quello che ho capito, questo precedenti SO risposta fornita alcuni buoni collegamenti: How is attr_accessible used in Rails 4?

È necessario utilizzare Parametri attr_accessible/strong ogni volta che si sta accedendo cose dal Banca dati.

Aggiornamento

Oh essere giovani, e non si rendono conto Rails 4 utilizza Params forti. Capisco che l'OP abbia già risolto il suo problema originale, ma correggo questo in modo che possa essere effettivamente utilizzato come risposta corretta.

Questo sarebbe un problema a livello di controller, in quanto Rails 4 richiede di autorizzare gli attributi nel controller.

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

maggior parte delle volte sarete permettendo gli stessi parametri in azione creare e aggiornare, quindi è meglio spostarlo in un proprio metodo all'interno del controller.

Come OP ha sottolineato nel suo commento, il metodo permesso_params che ha implementato non veniva chiamato dal permesso.

+0

mio problema stava passando il valore sbagliato nuovo metodo nel creare azioni, soluzione era quella di passare ad esso ad_params – Maki

+9

Questo probabilmente non dovrebbe essere contrassegnato come la risposta. – ghempton

+0

Questa non è la risposta. – snowYetis

31

Ho anche affrontato lo stesso problema e ho lavorato per 6 ore, e finalmente ho trovato la soluzione.

Prova questo codice, ti aiuterà! In Rails 4, questa funzione viene aggiunta per gestire la creazione in diversi modi.

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 
+0

titolo, prezzo, descrizione sono il nome della colonna della tabella Ad –

1

Il tuo è dovrebbe assomigliare a questa:

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

miniera di simile a questa:

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 
6

annuncio nuovo prima di aggiungere params.permit!

def create 
    params.permit! 
    @ad = Ad.new(params[:ad])  
    @ad.save 
    end 
+0

Si prega di prestare estrema attenzione quando si utilizza questo. Dalla documentazione di Rails: "Prestare estrema attenzione quando si usa il permesso !, in quanto consente di assegnare tutti gli attributi del modello attuali e futuri." –

Problemi correlati