2013-07-25 91 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文档:“使用许可证时应该非常小心,因为它可以批量分配所有当前和未来的模型属性。” –

相关问题