【问题标题】:rails 4 ActiveModel::ForbiddenAttributesError [duplicate]rails 4 ActiveModel::ForbiddenAttributesError [重复]
【发布时间】:2013-07-25 23:03:06
【问题描述】:

我尝试使用 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 传递给它

【问题讨论】:

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


    【解决方案1】:

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

    您的问题可能不在于您的控制器,而在于您的模型: 检查您的属性是否可以通过以下标签访问

    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 方法没有从许可中调用。

    【讨论】:

    • 我的问题是在创建操作中将错误的值传递给新方法,解决方案是将 ad_params 传递给它
    • 这可能不应该被标记为答案。
    • 这不是答案。
    • 我同意,这对我遇到同样问题的任何事情都没有帮助,而且这个答案也没有任何帮助我仍然得到 ActiveModel::ForbiddenAttributesError in PostsController 错误。
    • @Ömer 几周后发布了更新以确保不会出错,看看是否适合您。
    【解决方案2】:

    我也遇到了同样的问题,工作了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
    

    【讨论】:

    • title、price、description为表Ad的列名
    【解决方案3】:

    添加 params.permit 之前的新广告!

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

    【讨论】:

    • 使用时请格外小心。来自 Rails 文档:“使用 permit 时应格外小心!因为它将允许对所有当前和未来的模型属性进行批量分配。”
    【解决方案4】:

    你的应该是这样的:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多