铁轨没有保存嵌套属性



我有表任务和项目。我有一个用于项目的表格,其中我记录了所有任务可能拥有的所有可能的项目,这很好。然后,我有一个任务表格,其中所有项目都与字段一起显示,以便为每个项目提供成本值。这将导致任务和项目之间的联接:taskitem(此表包含task_id,item_id and cop)。

当我提交表格时,它是保存任务,而不是关联的任务标准。我看不到我缺少的东西,因为我搜寻了很多问题,而且似乎没有什么可用。请,请参阅下面的代码。   型:

class Task < ApplicationRecord
    has_many :task_items
    has_many :items, :through => :task_items
    accepts_nested_attributes_for :task_items, :allow_destroy => true
end
class Item < ApplicationRecord
    has_many :task_items
    has_many :tasks, :through => :task_items
end
class TaskItem < ApplicationRecord
    belongs_to :task
    belongs_to :item
    accepts_nested_attributes_for :item, :allow_destroy => true
end

控制器:

def new
    @items = Item.all
    @task = Task.new
    @task.task_items.build
end
def create
    @task = Task.new(task_params)
    @task.save
    redirect_to action: "index"
end
private def task_params
    params.require(:task).permit(:id, :title, task_items_attributes: [:id, :item_id, :cost])
end

我的观点:

<%= form_for :task, url:tasks_path do |f| %>
<p>
    <%= f.label :title %><br>
    <%= f.text_field(:title, {:class => 'form-control'}) %><br>
</p>
<% @items.each do |item| %>
    <% @task_items = TaskItem.new %>
    <%= f.fields_for :task_items do |ti| %>
        <%= ti.label item.description %>
        <%= ti.text_field :cost %>
        <%= ti.hidden_field :item_id, value: item.id %>
    <% end %>
<% end %>
<p>
    <%= f.submit({:class => 'btn btn-primary'}) %>
</p>

您需要在类任务中的has_many方法中添加inverse_of选项:

class Task < ApplicationRecord
  has_many :task_items, inverse_of: :task
  has_many :items, through: :task_items
  accepts_nested_attributes_for :task_items, :allow_destroy => true
end

这是由于创建一个新的TaskItem实例时的原因,它要求已在数据库中存在的任务实例能够抓住id fo fo fo task实例。使用此选项,它跳过了验证。

您可以阅读有关inverse_of选项及其用例的文章。

fields_for可以选择指定要存储信息的对象。与has_many集合中构建每个任务网络的结合,应确保正确设置所有关系。

查看代码:

<%= form_for @task do |f| %>
  <p>
    <%= f.label :title %><br>
    <%= f.text_field(:title, {:class => 'form-control'}) %><br>
  </p>
  <% @items.each do |item| %>
    <% task_item = @task.task_items.build %>
    <%= f.fields_for :task_items, task_item do |ti| %>
      <%= ti.label item.description %>
      <%= ti.text_field :cost %>
      <%= ti.hidden_field :item_id, value: item.id %>
    <% end %>
  <% end %>
  <p>
    <%= f.submit({:class => 'btn btn-primary'}) %>
  </p>  
<% end %>

控制器代码:

def index
end
def new
  @items = Item.all
  @task = Task.new
end
def create
  @task = Task.new(task_params)
  @task.save
  redirect_to action: "index"
end
private
def task_params
  params.require(:task).permit(:id, :title, task_items_attributes: [:id, :item_id, :cost])
end

相关内容

  • 没有找到相关文章

最新更新