项目详情 - > rails 5.1和ruby 2.4.1
我正在尝试创建一个简单的待办事项应用。我的问题是嵌套的模型形式。 如果我创建一个没有任何任务的项目,我保存它。然后,如果我想编辑项目并添加一些任务,则任务字段不会显示。如果我在创建项目时添加任务,一切都按预期工作。在编辑页面我可以看到项目和任务,我也可以编辑。
下面是我的两个型号。我没有使用嵌套路线。只使用嵌套的模型表单。
class Project < ApplicationRecord
has_many :tasks, inverse_of: :project, dependent: :destroy
validates :name, presence: :true
validates :description, presence: :true
accepts_nested_attributes_for :tasks, reject_if: proc { |attributes| attributes[:name].blank? }
end
class Task < ApplicationRecord
belongs_to :project, inverse_of: :tasks
end
以下是我的_form partial for new和edit。
<%= form_for @project do |form| %>
<% if @project.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@project.errors.count, "error") %> prohibited this project from being saved:</h2>
<ul>
<% @project.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= form.label :name %>
<%= form.text_field :name, id: :project_name %>
</div>
<div class="field">
<%= form.label :description %>
<%= form.text_field :description, id: :project_description %>
</div>
<%= form.fields_for :tasks do |task_form| %>
<div class="field">
<%= task_form.label :task_name %>
<%= task_form.text_field :name, id: :task_name %>
</div>
<div class="field">
<%= task_form.label :task_description %>
<%= task_form.text_field :description, id: :task_description %>
</div>
<% end %>
<div class="actions">
<%= form.submit %>
</div>
<% end %>
项目控制器的白名单如下。
def project_params
params.require(:project).permit(:name, :description, tasks_attributes: [:id, :name, :description])
end
感谢任何帮助 -Ajith
答案 0 :(得分:1)
如果我创建一个没有任何任务的项目并保存它。然后,如果我想编辑项目并添加一些任务,则任务字段不会显示。
......实际应该如何。因此,您的问题很可能与强参数问题无关,因为我在您的视图文件和project_params
方法中没有发现任何明显的问题。现在既然你不想要这种行为,那么你可能会想要以下内容,如果没有task
,默认情况下会构建一个或多个task
个对象与project
关联的对象,以便在您创建或修改task
时始终至少有一组project
个字段。
应用/控制器/ projects_controller.rb 强>
class ProjectsController < ApplicationController
def new
@project = Project.new
@project.tasks.build
# the above code just above is the same as below
# @project.tasks << Task.new
# now you can call this again like below, if you want 2 groups of `tasks` fields when you're creating a Project
@project.tasks.build
end
def edit
@project = Project.find(params[:id])
# this project may not yet have a `Task` object associated to it; if so we build a `Task` object like so
# this builds 3 `Task` objects; you can just use one below if you just want to show one in your edit form.
if @project.tasks.count == 0
@project.tasks.build
@project.tasks.build
@project.tasks.build
end
end
end
P.S。如果你想拥有一个可以为你自动构建动态嵌套属性的表单(比如你想要2个按钮,如下所示)&#39;(添加更多任务)&#39;你可能对cocoon
gem感兴趣39;和&#39;(删除此任务)`