2013-07-25 122 views
25

我嘗試做使用Rails 4簡單的創建軌道4加載ActiveModel :: ForbiddenAttributesError

我的控制器:

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:

我的問題是傳遞錯誤的價值,新的方法,在創建行動:解決辦法是通過ad_params

回答

39

我建議跳過更新,以便您的代碼工作

您的問題可能不在您的控制器中,而是您的型號: 檢查您的屬性是否可以使用後續標籤

attr_accessible :title, :price, :description 

軌道4確實做到這一點有點不同從我個人理解,這之前的SO回答中提供一些很好的鏈接: How is attr_accessible used in Rails 4?

您需要使用attr_accessible /強PARAMS每當你從訪問的東西數據庫。

更新

哦,是年輕的,而不是實現軌道4使用強大的PARAMS。我知道OP已經解決了他原來的問題,但我會糾正這個問題,以便它可以被用作正確的答案。

這將是一個控制器級別的問題,因爲Rails 4要求您將控制器中的屬性列入白名單。

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在他的評論中指出,他實施了permitted_pa​​rams方法沒有被從許可證調用。

+0

我的問題是傳遞錯誤的價值,新的方法,在創建行動,解決辦法是通過ad_params它 – Maki

+9

這大概不應該被標記爲答案。 – ghempton

+0

這不是答案。 – snowYetis

31

我也遇到了同樣的問題,工作了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 
+0

標題,價格,描述是表格的名稱廣告 – 2013-10-02 08:12:11

1

你的應該是這樣的:

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 
6

廣告新前加params.permit!

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

使用時請格外小心。從Rails文檔:「使用許可證時應該非常小心,因爲它可以批量分配所有當前和未來的模型屬性。」 –

相關問題