我有一个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.erb
和edit.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?
答案 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_project
到project
的网址的属性。
请参阅: