即使在 rails 5 中列入白名单后也不允许使用属性
unpermitted attributes even after whitelisting in rails 5
项目详情 -> rails 5.1 和 ruby 2.4.1
我正在尝试创建一个简单的待办事项应用程序。我的问题是嵌套模型表单。
如果我创建一个没有任何任务的项目并保存它。然后如果我想编辑项目并添加一些任务,任务字段不会显示。如果我在创建项目时添加任务,一切都像 expected.in 编辑页面一样工作,我可以看到项目和任务,我也可以编辑。
以下是我的 2 个模型。我没有使用嵌套路由。仅使用嵌套模型形式。
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。
<%= 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
感谢任何帮助
-阿吉斯
if i create a project without any task and i save it. then if i want to edit the project and add some tasks, tasks fields are not showing up.
... 应该是这样的。所以你的问题很可能与强参数问题无关,因为我在你的视图文件和你的 project_params
方法中没有看到任何明显的问题。现在因为你不想要这种行为,你可能想要像下面这样的东西,如果没有 task
对象关联到 project
但是,当您创建或编辑 project
.
时,总会有至少一组 task
字段
app/controllers/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。如果您想拥有一个可以自动为您构建动态嵌套属性的表单,您可能对 cocoon
gem 感兴趣(例如,您想要如下所示的 2 个按钮)'(添加更多任务)'和'(删除此任务)`
项目详情 -> rails 5.1 和 ruby 2.4.1
我正在尝试创建一个简单的待办事项应用程序。我的问题是嵌套模型表单。 如果我创建一个没有任何任务的项目并保存它。然后如果我想编辑项目并添加一些任务,任务字段不会显示。如果我在创建项目时添加任务,一切都像 expected.in 编辑页面一样工作,我可以看到项目和任务,我也可以编辑。
以下是我的 2 个模型。我没有使用嵌套路由。仅使用嵌套模型形式。
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。
<%= 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
感谢任何帮助 -阿吉斯
if i create a project without any task and i save it. then if i want to edit the project and add some tasks, tasks fields are not showing up.
... 应该是这样的。所以你的问题很可能与强参数问题无关,因为我在你的视图文件和你的 project_params
方法中没有看到任何明显的问题。现在因为你不想要这种行为,你可能想要像下面这样的东西,如果没有 task
对象关联到 project
但是,当您创建或编辑 project
.
task
字段
app/controllers/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。如果您想拥有一个可以自动为您构建动态嵌套属性的表单,您可能对 cocoon
gem 感兴趣(例如,您想要如下所示的 2 个按钮)'(添加更多任务)'和'(删除此任务)`