【问题标题】:Json post hasMany to Rails 4 fails with Unpermitted parametersJson post hasMany 到 Rails 4 失败,参数未允许
【发布时间】:2014-12-13 04:54:41
【问题描述】:

我正在尝试将 json 消息发布到 Rails 4.1.1 服务器,但由于未经允许的参数而失败。我也在使用 Mongoid,并通过 POST 和 application/json 的内容类型提交。

这是我的域名:

class Sale
  include Mongoid::Document
  include Mongoid::Timestamps

  field :internalId, type: String

  embeds_many :saleItems

  accepts_nested_attributes_for :saleItems

end

这是控制器代码:

    def sale_params
      params.require(:sale).permit(:internalId, :parentInternalId, :externalId, :internalIdForStore, :internalIdForCustomer, :sendReceiptType, :saleItems)
    end


 # POST /sales
  # POST /sales.json
  def create
    @sale = Sale.new(sale_params)


    #####################

    puts "parent: "
    puts @sale.inspect

    puts "collections: "

    @sale.saleItems.each do |si|
       puts "collection here"
       puts si.inspect
    end


    respond_to do |format|
      if @sale.save
        format.html { redirect_to @sale, notice: 'Sale was successfully created.' }
        format.json { render action: 'show', status: :created, location: @sale }
      else
        format.html { render action: 'new' }
        format.json { render json: @sale.errors, status: :unprocessable_entity }
      end
    end
  end

我已经成功地在 rails 之外很好地保存了集合 saleItems,并且只使用了一个 ruby​​ 脚本,集合通过 Mongoid 成功保存。

这是 JSON 内容:

{
    "sale" : {
        "internalId":"77E26804-03CC-4CA9-9184-181C2D8CB02A"
        "saleItems" : [
              {
                "inventoryName" : "inv 1"
              },
              {
                "inventoryName" : "inv 2"
              }
        ]      

    }
}

【问题讨论】:

    标签: ruby-on-rails ruby json mongoid


    【解决方案1】:

    哇,我想通了。它需要有围绕项目集合的 {}。

    params.require(:sale).permit(:internalId, :parentInternalId, :externalId, :internalIdForStore, :internalIdForCustomer, :sendReceiptType, 
    {:saleItems => [:inventoryName, :internalIdForSeller]})
    

    这是我发现的有助于解决问题的帖子。

    Rails 4 - Strong Parameters - Nested Objects

    【讨论】:

      【解决方案2】:

      我认为问题在于允许的强参数。

      你有

       params.require(:sale).permit(:internalId, :parentInternalId, :externalId, :internalIdForStore, :internalIdForCustomer, :sendReceiptType, :saleItems)
      

      但 salesItems 是另一个类。你需要类似的东西

       params.require(:sale).permit(:internalId, :parentInternalId, :externalId, :internalIdForStore, :internalIdForCustomer, :sendReceiptType, :saleItems_attributes  => [:inventoryName, :anotherAttribute, :stillAnotherAttribute])
      

      【讨论】:

      • 我试过了,但没有运气。我尝试了一堆不同的许可语句,但肯定是强参数的问题。
      • 两件事:你能发布你的日志吗?并且您可能想要考虑转换为字段的 ruby​​ 标准命名约定。查看github.com/bbatsov/ruby-style-guide 开始。这可能与您的问题有关,因为您的参数是如何匹配的。
      • 我想通了,所以我发布了一个答案,但是你的 ruby​​ 风格指南非常值得。我是 ruby​​ 的新手,所以我将一些 Java 包袱带入了 ruby​​/rails。问题是由于项目集合周围没有 {}。看我上面的回答。谢谢
      【解决方案3】:

      请编辑你的答案,告诉你params你得到了什么。

      params 是数据结构,它是一个请求对象。而permit 是一种允许特定参数的方法。

      所以输入debugger,你就会很容易发现问题所在。

      【讨论】:

        猜你喜欢
        • 2017-04-21
        • 1970-01-01
        • 2013-08-01
        • 2023-03-23
        • 1970-01-01
        • 2017-09-15
        • 2013-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多