Ruby on rails 在同一页面上为表单创建新记录,并列出导致奇怪结果的所有记录

Ruby on rails 在同一页面上为表单创建新记录,并列出导致奇怪结果的所有记录,ruby-on-rails,Ruby On Rails,我想有一个表单,在同一页上添加一个新部门,作为所有能够删除同一页上部门的列表。然而,通过在departments索引上为表单准备Department实例,似乎会创建一个额外的“空白”实例,这会把事情搞砸。以下是我所拥有的: 部门的表格和列表: 以及部门总监: 类部门控制器

我想有一个表单,在同一页上添加一个新部门,作为所有能够删除同一页上部门的列表。然而,通过在departments索引上为表单准备Department实例,似乎会创建一个额外的“空白”实例,这会把事情搞砸。以下是我所拥有的:

部门的表格和列表: 以及部门总监:
类部门控制器
但是,当没有保存任何部门时,它仍然会列出一个空白的“删除”按钮,该按钮将不起作用@有吗?不管这里发生什么,这都是真的


有不同的方法吗?

问题就在这里:

@departments = current_user.company.departments
@department = current_user.company.departments.new
第二行是在列表中添加一个新的空部门,因为它更改了部门列表的引用。另外,您应该使用build而不是new

为了避免列出额外的元素,您可以在列表上使用collect或reject并过滤空元素(希望是无效的):

或者,不要将模型放在控制器中的关系中,而是在即将保存时执行该操作。比如:

form_for Department.new do |f|
然后在控制器上,将其保存在右侧列表中(一旦您从params构建了对象)


current_user.company.departments我猜在提交表单时会创建空记录,但没有输入名称字段

按如下方式修改您的创建方法:
def创建
当前用户.company.departments.create( 名称:参数[:部门][:名称] )
如果参数[:部门][:名称]。是否存在?
重定向到部门路径
结束

使用条件语句可以避免创建空记录。是吧?

此外,我还可以在删除操作中看到一些不需要的查询:

department = current_user.company.departments.find(params[:id])
department.destroy
可以修改为

department = Department.find_by_id(params[:id])
department.destroy
您正在根据param id查找department对象,因此嵌套关联模型时不必这样做

这可能对你有帮助


谢谢

是的,我想这就是问题所在……解决方案呢?:)谢谢…我甚至不知道你可以为Department.net做form|u do | f |…非常有趣。谢谢,我回家后会试试的!
form_for Department.new do |f|
current_user.company.departments << @department
department = current_user.company.departments.find(params[:id])
department.destroy
department = Department.find_by_id(params[:id])
department.destroy