我有一个非常标准的用例.我有一个父对象和一个子对象列表.我希望有一个表格形式,我可以一次编辑所有的孩子,作为表中的行.我还希望能够插入一个或多个新行,并在提交时将它们创建为新记录.
当我使用a fields_for
为has-many相关的嵌套记录呈现一系列子表单时,rails会生成字段名称,例如parent[children_attributes][0][fieldname]
,parent[children_attributes][1][fieldname]
依此类推.
这会导致Rack解析一个看起来像的params哈希:
{ "parent" => {
"children" => {
"0" => { ... },
"1" => { ... } } }
Run Code Online (Sandbox Code Playgroud)
传递一个新的(非持久化)对象时,同样fields_for
会生成一个如下所示的字段名称:
parent[children_attributes][][fieldname]
Run Code Online (Sandbox Code Playgroud)
注意[]
它没有索引.
这不能以相同的形式发布包含的字段[0]
,[1]
等等.因为机架迷糊和加薪
TypeError: expected Array (got Rack::Utils::KeySpaceConstrainedParams)
Run Code Online (Sandbox Code Playgroud)
"OK",我想."我只是确保所有字段都使用[]
表单而不是[index]
表单.但我无法弄清楚如何说服fields_for
这样做.即使我给它一个明确的字段名称前缀和对象:
fields_for 'parent[children_attributes][]', child do |f| ...
Run Code Online (Sandbox Code Playgroud)
只要child
持久化,它就会自动修改字段名,使它们成为例如parent[children_attributes][0][fieldname]
,同时为新记录保留字段名parent[children_attributes][][fieldname]
.再一次,Rack barfs.
我不知所措.我如何使用标准的Rails助手fields_for
来提交多条新记录以及现有记录,将它们解析为params中的数组,并将所有缺少ID的记录创建为DB中的新记录?我不幸运,我只需手动生成所有字段名称?
我最近和一位同事讨论了嘲笑问题.他说,嘲弄课程非常糟糕,不应该在少数情况下完成.
他说只有界面应该被嘲笑,否则就是架构错误.
我想知道为什么这句话(我完全信任他)是如此正确?我不知道,并且想要被说服.
我是否想念嘲笑(是的,我读过Martin Fowler的文章)
在深入了解Pharo时,我印象最深刻的事情之一就是Finder可以通过示例找到它.我以前只在像Haskell这样的语言中看到过这种情况,在那里可以确定函数没有副作用.Pharo如何以安全,高效和无副作用的方式实现这一目标?
我发现默认的测试并行化使得 chromedriver 测试非常不可靠。但我想保持其他测试并行。
我试过这个application_system_test_case.rb
:
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
parallelize(workers: 1)
# ...
end
Run Code Online (Sandbox Code Playgroud)
...但它似乎没有覆盖默认值。
我目前正在使用:
PARALLEL_WORKERS=1 rails test:system
Run Code Online (Sandbox Code Playgroud)
...但我正在寻找一种方法将其硬编码到项目中,这样其他人就不必“只知道”总是为系统测试设置该环境变量。
我想写一个脚本,打包成一个gem,它将修改它的参数,然后exec
用修改后的参数修改一个新的ruby进程.换句话说,类似于shell脚本,它修改了它的参数,然后执行了exec $SHELL $*
.为了做到这一点,我需要一种健壮的方法来发现正在执行当前脚本的ruby可执行文件的路径.我还需要获取传递给当前进程的完整参数 - Ruby参数和脚本参数.
我已经听过很多关于Ruby的信息,甚至Javascript可能是"真正的"面向对象语言,而C++和C#则是面向类(或基于模板)的语言.真正的OO是什么意思,这对于类/模板方法有什么好处?
虽然1.8.7的构建我似乎有一个backported版本Shellwords::shellescape
,但我知道该方法是一个1.9功能,并且在早期版本的1.8中肯定不支持.有没有人知道我能找到哪里,无论是Gem形式还是仅作为一个片段,一个强大的独立实现Bourne-shell命令逃避Ruby?