首先,这是代码: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", ...]
或"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或化学服务以获得您的建议(我在实验室工作),因为我需要了解它并开始工作。
感谢阅读, -亚当 tl; dr - 表单不是以我认为的方式“散列”表单中的属性。
- EDITS-- 11/29/2012 - 我仍然无法理解为什么参数哈希会像现在这样扭曲,但是,如果我能弄清楚如何做一件事,我会想出一个合理的解决方法:配置一个删除选择通过formtastic或我自己的方法。也就是说,已经通过项目的创建表单,我可以根据需要创建尽可能多的分析请求,现在我需要一种方法来通过编辑表单添加和删除它们。我可以看到集合中的一个选项设置为“删除”,数据库ID使用控制器级别的方法;然而,更迫切的是能够以我尚未能通过Rails 3.2.1实现的形式添加其他请求。我知道它在2.3.5中有效,但到目前为止,它还没有用于我的配置。我发现时会发布更多内容。
+2小时(稍后) - 实施Ryan Bates的ep.197方法,用于删除目前为止的字段;但是,我遇到了某种形式,其中无论是formtastic还是我的模型都不知道如何处理_destroy字段,即使我设置了:allow_destroy =>真正。也许它与链接的位置有关?这是我最新表单的代码(js和应用程序帮助程序代码可以看作here):http://pastie.org/5454653
答案 0 :(得分: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 %>