在Rails 4 here is the question中了解如何执行此操作。我想知道的是,尽管这行得通,但是为什么日志仍然提示?

在Rails 5.1.3中,我有一个JSON列(letterhead)作为我的模型属性之一(并且在json内是具有各种属性的哈希,我不在乎将其列入白名单)。我只想允许/将列本身列入白名单。

关于Rails 5.1.4的说明

5.1.4中提供了一种Rails方法,请参见this commit
对此,github上有一个相当长的讨论here。在Rails 5.1.4中,它就是这样:

def account_params
  params.require(:account).permit(:id, :name, :plan_id, letterhead: {})
end

允许使用:letterhead参数,日志中不会显示任何错误,并且会保存模型。但显然,它允许在该参数内进行任意输入,因此请谨慎使用。

如果您确实想限制在此参数中允许使用哪些哈希键,则也可以将其列入白名单,例如:
def account_params
  params.require(:account).permit(:id, :name, :plan_id, letterhead: [:address, :logo, :contact_info])
end

现在,这可以防止:letterhead中的任何其他任意键,因为我明确只允许使用这3个-:address, :logo, :contact_info
Rails 5.1.3(及更低版本)

我可以使用以下任一方法来允许使用本专栏(另请参阅链接的讨论以了解其他可能的选择):

选项1
def account_params
  params.require(:account).permit(:id, :name, :plan_id, :letterhead).tap do |whitelisted|
    whitelisted[:letterhead] = params[:account].fetch(:letterhead, ActionController::Parameters.new).permit!
  end
end

选项2
def account_params
  params.require(:account).permit(:id, :name, :plan_id, :letterhead).tap do |whitelisted|
    whitelisted[:letterhead] = params[:account][:letterhead].permit!
  end
end

在这两种情况下,模型均会保存,但在日志中仍会显示“未经许可的参数:letterhead”
  • 为什么在我明确允许后仍要说呢?
  • 另外,选项1和选项2之间是否有真正的区别?

  • 编辑

    数据是这样的:
    {"id"=>"a61151b8-deed-4efa-8cad-da1b143196c9",
    "plan_id"=>"1dc49acf-3111-4030-aea1-7db259b53a51",
    "name"=>"Test Account 1",
    "is_active"=>true,
    "letterhead"=>{"left"=>"", "center"=>"", "right"=>""},
    "created_by"=>nil,
    "updated_by"=>nil,
    "created_at"=>"2017-10-14T19:05:40.197Z",
    "updated_at"=>"2017-10-20T15:14:08.194Z"}
    

    最佳答案

    为什么在我明确允许的情况下仍要说呢?

    日志来自 #unpermitted_parameters! #permit 。所有这些都发生在调用#tap之前。

    选项1和选项2之间有什么真正的区别?

    差异归结为

    params[:account].fetch(:letterhead, ActionController::Parameters.new).permit!
    


    params[:account][:letterhead].permit!
    

    如果未传递NoMethodError,则后者将导致:letterhead,因为params[:account][:letterhead]将返回nil。前者返回一个空的参数哈希。

    关于ruby-on-rails - Rails 5.1-允许使用JSON参数,但在日志中仍显示为不允许,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46849957/

    10-13 09:02