展开Rails POST参数哈希并映射到具有强参数的模型属性

时间:2015-12-13 00:56:36

标签: ruby-on-rails ruby hash strong-parameters

我正在构建一个rails4 api,我发布了一个嵌套的属性哈希。但是,该模型实际上没有嵌套属性或关联。尝试通过将一些属性组合到一个组中来制作更干净的post params哈希,但让api处理解包和强参数验证。

closeLightbox()

但该模型实际上没有## Example POST params params[:item][:group] = { a: true, b: false } 列,属性groupa直接属于模型。

在没有b包装器的情况下处理此问题只是

group

但我希望通过params.require(:item).permit(:a, :b) 包装器提交strong_parameters。我如何实现这一目标,但如上所述有POST参数?

3 个答案:

答案 0 :(得分:1)

您可以在调用操作之前删除所有中间级别:

class YourController < ApplicationController
  before_action :flatten_item_params

  private

  def flatten_item_params
    params[:item] = params.require(:item).each_with_object({}) do |(key, value), result|
      result.merge!(value)
    end
  end

  def item_params
    params[:item].permit(:a, :b)
  end
end

答案 1 :(得分:1)

关于&#34;嵌套&#34;的传递;参数,docs are pretty explicit;如果推荐Hoang Phan,您可以将嵌套哈希传递给控制器​​:

params: {
   object: {
      title: "Test",
      group: {
         a: "test", 
         b: "test"
      }
   }
}

这可以通过以下方式接受:

def params
   params.require(:object).permit(:title, group: [:a, :b])
end

-

问题,我相信所有的密钥都必须存在于模型中。要解决此问题,您可以使用virtual attribute

#app/models/your_model.rb
class YourModel < ActiveRecord::Base
   attr_accessor :group, :a, :b
end

不保存虚拟属性,而是将实例方法附加到类中,允许您使用不需要放入数据库的数据填充它。

使用上面的 可以让你使用嵌套的params哈希;唯一的缺点是你必须坚持group: [:a, :b]作为你的参数的结构。

答案 2 :(得分:0)

像大多数ruby / rails情况一样,这可能是更好的方法。从反应中抓住我最终看到这种看似黑客的方法。重要的是,它做了我正在寻找的东西,但感觉很蠢,所以如果有人有更优雅的方式请分享!

class YourController < ApplicationController

private

  ## POST { item: { group: { a: true, b: false } } }
  def item_params
    group = params[:item][:group].presence

    if group
      ## Unwrap nesting and place at root of params[:item]
      ## Probably should explicitly handle this instead of iterating
      group.each {|k,v| params[:item][k] = v }
      params[:item].delete :group
    end

    params[:item].permit(:a, :b)
  end
end