【问题标题】:Creating model with nested attributes on rails 4 without fields_for, is it possible?在没有fields_for的rails 4上创建具有嵌套属性的模型,这可能吗?
【发布时间】:2014-01-12 19:27:24
【问题描述】:

我有 2 个模型

1) 项目

class Project < ActiveRecord::Base
  has_many :tasks
  accepts_nested_attributes_for :tasks

  validates :priority, presence: true
  validates_date :due_date, :after => lambda {Date.current}
  validates_length_of :name, minimum: 5, maximum: 40
  validates_length_of :description, minimum: 10, maximum: 200
end

2) 任务(属于 Project)

class Task < ActiveRecord::Base
  belongs_to :project, dependent: :destroy

  validates_length_of :name, minimum: 3, maximum: 50
end

我的控制器:

   def create
      @project = Project.new(project_params)
      @project.save!
      redirect_to projects_path   
  end

  def new   
    @project = Project.new

    respond_to do |format|
      format.html
      format.js
    end

  def project_params
    params.require(:project).permit(:name, :description, :due_date, :priority, 
    tasks_attributes: [:name])
  end

当我点击表单中的提交按钮时,我可以看到带有嵌套属性(任务)的请求进来了,所以它被正确保存了,但是,只有项目被保存了,不是任务。

我意识到我没有使用 field_for(因为我在运行时通过 Javascript 生成它)。

有人知道如何解决这种情况吗?

编辑:

我已经尝试project.tasks.build 进入新操作,但行为仍然存在。

到达create action的Request是:

{"utf8"=>"✓",
"authenticity_token"=>"GItsCNKllmEEYnhihDLx9QRuObWPNL4qwZBKt56Yss0=",
"project"=>{"name"=>"werwfeb3b33b",
"description"=>"rb3rb3rb3rb3rb",
"due_date"=>"2014-01-21",
"priority"=>"2"},
"tasks"=>{"0"=>{"name"=>"2e2ev"}}}

而产生任务模型的运行时字段“name”的javascript(coffeescript)函数代码是:

AddTaskComponent = ->  
  numberOfTasks++
  $('.tasks').append("<div id='TaskTextField" + numberOfTasks + "' class='input-group'><span class='input-group-addon'>Nome" +
  "</span><input type='text' id='taskname" + numberOfTasks + "' name='tasks[" + (numberOfTasks - 1) + "][name]' class='form-control' placeholder='Insira o nome da tarefa'></div>") 

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 nested-attributes fields-for


    【解决方案1】:

    您几乎拥有它...您的表单正在返回一个 params 哈希,其中包括其他参数:

    "tasks"=>{"0"=>{"name"=>"2e2ev"}} 
    

    但你应该返回的是

    "tasks_attributes"=>{"0"=>{"name"=>"2e2ev"}}
    

    所以您可能会立即看到在哪里更改您的 javascript 以构造正确格式的参数哈希。输入字段的“名称”属性必须是固定的。

    【讨论】:

      【解决方案2】:

      在保存@project 之前,您没有使用参数更新它,所以它只是保存了您在new 中创建的新实例。一旦你解决了这个问题,我认为你还必须允许嵌套属性,如 http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html 中所述。

      【讨论】:

      • 我做到了,但仍然没有得到我的数据库中的嵌套属性,只有项目。
      • 您能否更新您的代码以反映create 的新版本?
      • 是的,我已经做到了。现在 create 操作将 new 和 save 放在一起。
      • 您介意更新您的Project 类定义以显示您是如何允许嵌套属性的吗?
      • 已编辑!如您所见,我使用了accepts_nested_attributes_for :tasks,因此项目可以接受任务作为嵌套属性。
      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多