rails 4 ActiveModel :: ForbiddenAttributesError

时间:2013-07-25 20:46:05

标签: ruby-on-rails ruby-on-rails-4

我尝试使用rails 4进行简单的创建

我的控制员:

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 我做错了什么?

更新

我的问题是在创建操作中将错误的值传递给新方法:解决方案是将ad_params传递给它

4 个答案:

答案 0 :(得分:39)

我建议您跳过更新,以便您的代码正常工作

您的问题可能不在您的控制器中,而是您的型号: 使用以下标记检查您的属性是否可访问

attr_accessible :title, :price, :description

Rails 4确实与我的理解略有不同,这个以前的SO答案提供了一些很好的链接: How is attr_accessible used in Rails 4?

每当您从数据库访问内容时,都需要使用attr_accessible / Strong Params。

<强>更新

哦,年轻,并没有意识到Rails 4使用强大的参数。我知道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在他的评论中指出的那样,他实施的allowed_pa​​rams方法没有从许可证中调用。

答案 1 :(得分: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

答案 2 :(得分:6)

在添加params.permit之前添加新内容!

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

答案 3 :(得分: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