带有命名空间模型名称的Rails form_for

时间:2017-12-03 21:01:19

标签: ruby-on-rails forms namespaces

我有一个projects/tasks/new的嵌套资源form_for,但我无法弄清楚如何自动生成所需的网址:

module Projects
  class Project < ApplicationRecord
    has_many :tasks
  end
end

module Projects
  class Task < ApplicationRecord
    belongs_to :project
  end
end

# in view files
<%= form_for [@project, @task] do |f| %> # => produces URL of projects_project_tasks_path

我想要的网址是project_tasks_path,但form_for使用命名空间Projects::Project作为网址前缀。

我目前的解决方案是使用单独的new.html.erbedit.html.erb视图文件手动指定网址:

# new.html.erb
<%= form_for @task, url: project_tasks_path(@project) do |f| %>
  <%= render "form", f: f %>
<% end %>

# edit.html.erb
<%= form_for @task, url: project_task_path(@project, @task) do |f| %>
  <%= render "form", f: f %>
<% end %>

这有效,但是复制了不必要的代码。请注意,我正在为新操作和编辑操作使用嵌套资源,因为我必须在任务资源上有项目上下文。

如何让form_for生成所需的网址并使用单个form.html.erb文件而不是2?

1 个答案:

答案 0 :(得分:1)

您可以通过覆盖模型名称来实现:

class Projects::Project < ApplicationRecord
  def model_name
    ActiveModel::Name.new(self, nil, "Project")
  end
end

class Projects::Task < ApplicationRecord
  def model_name
    ActiveModel::Name.new(self, nil, "Task")
  end
end

这会更改Projects::Project.model_name.param_key,这是用于生成从projects_projectproject的网址的属性。

请参阅: