即使在 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 个按钮)'(添加更多任务)'和'(删除此任务)`