0

我是构建 ReactJS (react-on-rails) + Rails 应用程序的一部分。我自己(还)不是 ReactJS 开发人员,但在选择 ReactJS 后被带入项目。

我的问题是关于通过创建和编辑发布请求从 React 发送到 Rails 的参数。我在这种情况下的模型:

class Hrfile < ActiveRecord::Base
  mount_uploader :attachment, AttachmentUploader
  has_and_belongs_to_many :sras
  ...
end

class Sra < ActiveRecord::Base
  ...
  has_and_belongs_to_many :hrfiles
  ...

  validates :name, presence: {message: "Please input a name"}
end

ReactJS 使用 Formsy-react 作为表单,我使用并修改了 react-select 作为多选表单,以满足 Formsy 的映射要求。

以下数据通过 React 的 .post('/sras').send(data) 从 ReactJS 发送:

{
active:null
address:null
asset_id:null
assetother:null
brand_id:null
city:null
conclusion:"Test conclusion"
country_id:null
enddate:null
hrfile_ids:["2","1"]
indicator_deteroriation:null
ireport_ids:null
name:"Test assessment"
organisation_id:null
region_id:null
reviewdate:null
startdate:null
treatment:null
user_id:null
}

我无法弄清楚的问题/错误是,当我通过 ReactJS 应用程序创建一个包含名称和 X 个 Hrfile 的新 Sra 并发布 JSON(如上所示)时。这是由 Rails 接收的:

Started POST "/sras" for 127.0.0.1 at 2016-04-05 16:29:07 +0800
Processing by SrasController#create as JSON
  Parameters: {"name"=>"Test assessment", "organisation_id"=>nil, "brand_id"=>nil, "user_id"=>nil, "asset_id"=>nil, 
"startdate"=>nil, "reviewdate"=>nil, "address"=>nil, "city"=>nil, "region_id"=>nil, "country_id"=>nil, "assetother"=>nil, "enddate"=>nil, "active"=>nil, "treatment"=>nil, 
"indicator_deteroriation"=>nil, "conclusion"=>"Test conclusion", "ireport_ids"=>nil, "hrfile_ids"=>["2","1"],  
"sra"=>{"name"=>"Test assessment", "organisation_id"=>nil, "country_id"=>nil, "user_id"=>nil, 
"startdate"=>nil, "enddate"=>nil, "reviewdate"=>nil, "active"=>nil, "city"=>nil, "address"=>nil, "asset_id"=>nil, "assetother"=>nil, 
"indicator_deteroriation"=>nil, "conclusion"=>"Test conclusion", "brand_id"=>nil, "region_id"=>nil}}

ReactJS 应用程序确实转发了例如“hrfile_ids”=>[“2”,“1”],但是 ParamsWrapper(我怀疑)不将 'hrfile_ids' 识别为属性,因此仅保存名称。

有人知道我在这里缺少什么吗?

如果您需要任何其他代码块或详细信息,请告诉我。希望您能提供帮助:)提前致谢-

编辑

感谢 Jesper,指出“sra”对象是由Rails 中的params 包装器创建的。即使我在 Sra 和 Hrfile 这两个模型之间存在关系,我可以在其中调用 @sra.hrfiles 来获取所属的 Hrfile,但我仍然无法弄清楚将 hrfile_ids 参数包装到 JSON 中。

4

1 回答 1

0

这是由 ActionController 自动完成的。在此处查看更多信息:http: //api.rubyonrails.org/classes/ActionController/ParamsWrapper.html

hrfile_ids可能不包括在内,因为 Rails 需要一个 ID 列表而不是带有id: X.

您可以像这样使用 strong_params:params.require(:sra).permit(:name, hrfile_ids: [])

于 2016-04-05T09:45:21.013 回答