2

首先,这里是代码: http: //pastie.org/5448967

现在,这里是场景:我有一个项目对象 - 不要担心附件批次,因为我还没有为这些批次实施解决方案 - 它具有相关的分析请求,其中有分析的设置选项。也就是说,有一个用户可以从中选择的分析表,并且为每个选择的分析创建一个分析请求,将分析链接到项目。

这就是问题所在:当尝试更新分析请求时,我注意到的第一件事是表单中的参数没有像我期望的那样“散列”。

这就是我想要的

params={:projects=>{"#{project_id}"=>{project_attribute, project_attribute, etc..., analysisrequests=>[array,of,analysis,ids]}, "#{project_id}"=>{project_attribute, project_attribute, etc..., analysisrequests=>[array,of,analysis,ids]}, ...}

这是我得到的

{"utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"XfIr7zfVNdlg5HS3Letw4sI/MGNFTtqntQYrgjAh9TY=", "project"=>{"1832"=>{"project_number"=>"261", "nof_samples"=>"5", "analysisrequest"=>{"analysis_id"=>["", "8",
 "12"]}}, "status_id"=>"13", "rush_service"=>"0", "customer_id"=>"111", "project_notes"=>"test", "sample_desc"=>"test", "user_id"=>"1", "quoted_price"=>"1", "1834"=>{"project_number"=>"777", "nof_samples"=>"1", "analysisrequest"=>{"analysis_id"=>["", "3", "9", "20", "22"]}}}, "commit"=>"Submit Changes"}

显而易见:我不太担心更改"analysisrequest"=>{"analysis_id"=>["", "8", ...]}"analysisrequest"=>["", "8", ...]or "analysisrequests"=>[](注意 s)。事实上,我这样做是为了在表单中呈现单个多选,而不是为与项目关联的每个请求(如果添加's',它会这样做) - “analysis_id”嵌套很好,你可以看到每个请求都可以有"analysisrequest"=>{"analysis_id"=>[],"project_id"=>[]},所以这显然是 Rails 在做它的工作。

我最担心的是,在哈希中第一个项目中的分析请求之后看到的附加参数在第二个之后没有出现。那,而且,这些附加参数不在“#{project_id}”键控的散列中,而是在它们自己的小世界中。这使我很难通过执行以下操作进行更新:

params[:projects].keys.each do |project_id|
'update entries based on project_id'
end

有没有人可以就这个问题给我一些专家建议?我愿意用我的 IT 或化学服务来换取您的建议(我在实验室工作),因为我需要启动并工作。

感谢阅读,-Adam tl;dr - Form 并没有以我认为应该的方式“散列”表单中的属性。

--EDITS-- 2012 年 11 月 29 日-我仍然无法理解为什么参数散列会像现在这样倾斜,但是,如果我能弄清楚如何做的话,我已经想出了一个合理的解决方法事情:通过formtastic或我自己的方法配置删除选项。也就是说,已经通过项目的创建表单,我能够根据需要创建尽可能多的分析请求,只是现在我需要一种通过编辑表单添加和删除它们的方法。我可以看到集合中的一个选项设置为“删除”,其中数据库 ID 使用控制器级别的方法;然而,更紧迫的是能够以我还无法通过 Rails 3.2.1 实现的形式添加其他请求。我知道它在 2.3.5 中有效,但到目前为止,它不适用于我的配置。我'

+2 小时(稍后)- 到目前为止,实施了 Ryan Bates 的 ep.197 删除字段的方法;但是,我遇到了某种陷阱,即使我设置了 :allow_destroy => true,formtastic 或我的模型也不知道如何处理 _destroy 字段。也许它与链接的位置有关?这是我最新表单的代码(js 和应用程序助手代码可以在这里看到): http: //pastie.org/5454653

4

1 回答 1

0

看看这个: http: //guides.rubyonrails.org/routing.html#adding-more-restful-actions

也许你应该有这些路线:

resources :projects do
  collection do
    get 'edit', action: 'edit_collection'
    put 'update_collection'
  end
end

不要忘记update_collection在控制器中定义一个方法。

请注意,您可以在 edit_collection.html.erb 中使用类实例,而不是渲染页面并传入本地。

例如:

<% @projects.each do |project| %>

代替

<% for project in projects %>
于 2012-11-28T07:53:27.083 回答