【问题标题】:rails does not wrap all paramters passedrails 不会包装所有传递的参数
【发布时间】:2014-06-20 00:51:14
【问题描述】:

我在 rails 中有两个模型
1.列表

   class List < ActiveRecord::Base
                has_many:list_hd_channel
    end

2 listhdchannel

class ListHdChannel < ActiveRecord::Base
          belongs_to :list
    end

我的配置/路由文件如下所示

namespace :api do
        resources :eagles, :defaults => {:format => 'json'}
        resources :daily13_channel,  :defaults => {:format => 'json'}
        resources :lists,  :defaults => {:format => 'json'}
end

问题是当发送带有任何参数的 PUT 请求 (json) 时,我在控制器处获得的参数未包含在密钥列表下。但是,如果我发送一个参数,它是模型“列表”的一列,那么它就会被包装。 请求

http://ip:3000/api/lists/1
{  
            "list_name": 1
}

服务器端日志

Started PUT "/api/lists/1" for address at 2014-06-19 17:32:01 -0700
Processing by Api::ListsController#update as JSON
Parameters: {"list_name"=>1, "id"=>"1", "list"=>{"list_name"=>1}}

请求

http://address:3000/api/lists/1
{  
            "any_param": 1
}

服务器端日志

Started PUT "/api/lists/1" for address at 2014-06-19 17:34:02 -0700
Processing by Api::ListsController#update as JSON
Parameters: {"any_param"=>1, "id"=>"1", "list"=>{}}

如您所见,服务器端日志不会将“any_param”包含在“list”中,即使 url 用于列表控制器。谁能帮我理解为什么它不包装我传递的任何参数,而只包装列表模型中的一列 (list_name)?

【问题讨论】:

  • 你是如何提出这些要求的?
  • @MaurícioLinhares 感谢您的回复。我正在 google chrome 中提出这些请求 Advanced Rest 客户端。

标签: ruby-on-rails json api rest model-associations


【解决方案1】:

http://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html

这里的最后一点解释了rails默认情况下会尝试检查是否存在与控制器名称相同的模型;如果是,则它使用模型/控制器名称的包装键并仅包装属于该模型的参数。

【讨论】:

  • 当模型存在时有什么办法可以避免这种行为?
  • 我用wrap_parameters明确定义模型的名称和参数解决了它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多