【问题标题】:Rails not displaying saving Model property using update_attributesRails 不显示使用 update_attributes 保存模型属性
【发布时间】:2016-06-09 01:10:43
【问题描述】:

我有一个项目模型。我最近将 project_name 添加到该模型中。但是,当我在字段中输入名称并创建一个新项目时,它不会保存新属性。

项目控制器:

def create
    if project.update_attributes(project_params)
      flash[:success] = 'Project was successfully created'
      redirect_to project_url(project)
    else
      render :new
    end
  end

def project_params
    params.require(:project).permit(:description, :project_name, :customer_number, :sales_number, :sales_id, :customer_id, :discount, :date_wanted, :price, 
                                    items_attributes: [:id, :name, :unit, :quantity, :price, :_destroy])
  end

项目模型:

include AASM

  STEP_FORWARD_STATE = {
    'quotes'     => :proposal,
    'proposals'  => :ordered,
    'orders'     => :active,
    'in_process' => :close
  }

  STEP_BACK_STATE = {
    'proposals'  => :quoted,
    'orders'     => :proposal,
    'in_process' => :ordered,
    'closed'     => :active
  }

  belongs_to :customer
  belongs_to :sales, class_name: 'User'

  has_many :curtains, dependent: :destroy
  has_many :versions, class_name: 'ProjectVersion', dependent: :destroy

  has_many :tasks, dependent: :destroy
  has_many :drape_tasks, class_name: 'DrapeTask', dependent: :destroy
  has_many :trough_tasks, class_name: 'TroughTask', dependent: :destroy

  has_many :items, dependent: :destroy
  accepts_nested_attributes_for :items, :allow_destroy => true

  delegate :email, :first_name, :full_name, :city_address, :name_for_select,
           :contry_address, :address_for_email, :phone_o,
           to: :customer, prefix: true, :allow_nil => true

  delegate :name_for_select, :address_for_email, :email, :city_address, :full_name, :rep_number, :first_title,
           to: :sales, prefix: true, :allow_nil => true

  validates :customer, :sales, presence: true

  attr_accessor :update_event

操作过程中的终端日志:

Started POST "/projects" for ::1 at 2016-06-08 15:54:57 -0400
Processing by ProjectsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"+vpCG6JPLLSBtntKhudPTopzq/MH0YlnjlfnFSsOVYnMfRY888LafcReDF41GIxb14q6DLdkbz/AwXEQi+iF4w==", "commit"=>"Create Project", "name"=>"TEST DAMMIT", "customer_autocomplete"=>"test@test.com", "project"=>{"customer_id"=>"1", "sales_id"=>"1", "discount"=>""}, "sales_autocomplete"=>"dzk@dzk", "description_autocomplete"=>"DID IT WORK"}
  User Load (0.5ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
  Profile Load (1.8ms)  SELECT  "profiles".* FROM "profiles" WHERE "profiles"."person_id" = $1 AND "profiles"."person_type" = $2 LIMIT 1  [["person_id", 1], ["person_type", "User"]]
  Project Load (1.5ms)  SELECT  "projects".* FROM "projects" WHERE "projects"."id" IS NULL  ORDER BY "projects"."id" ASC LIMIT 1
   (0.2ms)  BEGIN
  Customer Load (0.5ms)  SELECT  "customers".* FROM "customers" WHERE "customers"."id" = $1 LIMIT 1  [["id", 1]]
  Profile Load (1.2ms)  SELECT  "profiles".* FROM "profiles" WHERE "profiles"."person_id" = $1 AND "profiles"."person_type" = $2 LIMIT 1  [["person_id", 1], ["person_type", "Customer"]]
  User Load (1.7ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
  CACHE (0.0ms)  SELECT  "profiles".* FROM "profiles" WHERE "profiles"."person_id" = $1 AND "profiles"."person_type" = $2 LIMIT 1  [["person_id", 1], ["person_type", "User"]]
  SQL (0.8ms)  INSERT INTO "projects" ("state", "sales_id", "customer_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["state", "quotes"], ["sales_id", 1], ["customer_id", 1], ["created_at", "2016-06-08 19:54:57.746357"], ["updated_at", "2016-06-08 19:54:57.746357"]]
  Item Load (0.2ms)  SELECT "items".* FROM "items" WHERE "items"."project_id" = $1  [["project_id", 13]]
  Curtain Load (0.2ms)  SELECT "curtains".* FROM "curtains" WHERE "curtains"."project_id" = $1  [["project_id", 13]]
   (1.2ms)  COMMIT
Redirected to http://localhost:3000/projects/13

编辑(6 月 9 日):

感谢到目前为止的帮助,@taryn-east。 (还在上面添加了我的 project_params 以进行澄清)

这是我用于 project_name 的表单:

.form-group
    = label_tag 'name', 'Project Name', class: 'control-label'
    .controls
      = text_field_tag 'name', project.project_name, class: 'form-control', autocomplete: :off

为了比较,这里有一个用于模型工作参数的表格:

.form-group
    = label_tag 'customer_autocomplete', 'Customer', class: 'control-label'
    .controls
      = text_field_tag 'customer_autocomplete', project.customer_name_for_select, class: 'form-control customer-autocomplete', autocomplete: :off
      = f.hidden_field :customer_id

显然,f.hidden_​​field :[parameter] 丢失了。我将它添加到我的 project_name 字段中,让它看起来像这样:

.form-group
    = label_tag 'name', 'Project Name', class: 'control-label'
    .controls
      = text_field_tag 'name', project.project_name, class: 'form-control', autocomplete: :off
      = f.hidden_field :project_name

现在给我们留下一个终端日志:

Started POST "/projects" for ::1 at 2016-06-09 12:11:42 -0400
Processing by ProjectsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"BqEZsyQK+uLoeWewYC6smeC6CX0EGLcZgUQlmAyjtLqOmAb3v+2pw6VJ0hoBnISkGegz3fCAMT4+UPMVh28l8Q==", "commit"=>"Create Project", "project_name"=>"TEST PLS DEALER", "project"=>{"project_name"=>"", "customer_id"=>"1", "sales_id"=>"1", "discount"=>"", "description"=>""}, "customer_autocomplete"=>"test@test.com", "sales_autocomplete"=>"dzk@dzk", "description_autocomplete"=>"WORK PLS ONE TIME EHHHH"}

这是有希望的,因为添加

f.hidden_field :project_name

将 project_name 添加到 Create 操作中传递的项目哈希中,如下所示:

"project"=>{"project_name"=>"", "customer_id"=>"1", "sales_id"=>"1", "discount"=>"", "description"=>""}

但是,您可以看到参数的实际内容仍然在它应该驻留的字段之外。我做了一些挖掘并注意到我的字段和以前的工作字段之间的区别:工作的有类:“ [:parameter]-autocomplete" 在其中。我添加了适当的类到我的,它仍然没有工作。在应用程序的其他地方,有一个 Coffeescript:

$(document).on 'focus', '.customer-autocomplete', ->
  $(@).autocomplete
    source: "/customers",
    dataType: 'JSON',
    minLength: 2,
    select: (event, ui) ->
      $('#project_customer_id').val ui.item.customer_id
      $('#sales_autocomplete').val ui.item.sales_data
      $('#project_sales_id').val ui.item.sales_id
$(document).on 'focus', '.sales-autocomplete', ->
  $(@).autocomplete
    source: "/sales",
    dataType: 'JSON',
    minLength: 2,
    select: (event, ui) ->
      $('#project_sales_id').val ui.item.sales_id

我不熟悉 Coffeescript,但似乎这是使用类自动完成隐藏字段的原因:“[:parameter]-autocomplete”。如何为我添加的字段复制它?

编辑:(6 月 10 日)

我听取了您的建议并简化了迁移(绝对是一个好电话:))但它似乎仍然不合作。 新参数:

def project_params
    params.require(:project).permit(:description, :name, :customer_number, :sales_number, :sales_id, :customer_id, :discount, :date_wanted, :price, 
                                    items_attributes: [:id, :name, :unit, :quantity, :price, :_destroy])
  end

新表格:

.form-group
    = label_tag 'name', 'Project Name', class: 'control-label'
    .controls
      = text_field_tag 'name', project.name, class: 'form-control name-autocomplete', autocomplete: :off
      = f.hidden_field :name

新节目:

 Project Name:
    = project.name

尝试使用上述内容创建项目的终端日志:

Started POST "/projects" for ::1 at 2016-06-10 10:30:30 -0400
Processing by ProjectsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"iMt4rowEbO1UGzjwfl1XkraTbktC+5+/MiNzYvU/uxAA8mfqF+M/zBkrjVof73+vT8FU67ZjGZiNN6XvfvMqWw==", "commit"=>"Create Project", "name"=>"TEST PROJECT NAME", "project"=>{"name"=>"", "customer_id"=>"1", "sales_id"=>"1", "discount"=>"", "description"=>""}, "customer_autocomplete"=>"test@test.com", "sales_autocomplete"=>"dzk@dzk", "description_autocomplete"=>"TEST PROJECT DESCRIPTION"}

如您所见,我也遇到了与 project.description 相同的问题;是否有可能在应用程序中不包含这些新参数的其他地方定义了“项目”变量?在此过程中的任何时候,它都不会出现红屏。再次感谢到目前为止@taryn 提供的所有帮助 :)

【问题讨论】:

  • 您的控制器中project_params 中的内容是什么,您可以发布该方法吗?你能张贴你的表格吗?
  • 更新后尝试project.reload或使用update_attributes!更新项目。

标签: ruby-on-rails ruby rails-activerecord


【解决方案1】:

如果您查看服务器窗口中的输出,它会向您显示问题:

"name"=>"TEST DAMMIT", "customer_autocomplete"=>"test@test.com",
"project"=>{"customer_id"=>"1", "sales_id"=>"1", "discount"=>""}

该名称字段不是project 的一部分,因此不会作为project 的属性被拾取。

您希望从 params 看到的内容是:

"customer_autocomplete"=>"test@test.com",
"project"=>{"name"=>"TEST DAMMIT",  "customer_id"=>"1", "sales_id"=>"1", "discount"=>""}

这意味着您的表单有些问题。检查您的 name 字段是否与其他项目字段的完成方式相同

编辑:

在您的表单中,属性名为name

text_field_tag 'name',

但在您的其余代码中,它期望属性被命名为project_name

params.require(:project).permit(:description, :project_name

您必须将字段命名为与您在代码中使用的名称相同的字段:) 例如

text_field_tag 'project_name',

虽然 TBH,但如果可以的话,我强烈建议将其称为 name(并重写迁移等),因为 project.project_name 有点多余;)

【讨论】:

  • 谢谢,@taryn,这绝对有帮助。我添加了一些新信息,你怎么看?
  • 试过了,但这似乎不起作用。添加了更多信息,看看这是否有助于解决问题。
  • 好的,那么您设置表单的方式肯定有问题。您能否添加完整的表单,而不仅仅是包含此字段的表单组?
  • 哦,等等,这是 al javascripty 自动完成...是的,这会让事情变得复杂...
  • 但是 - 您仍然可以尝试按照控制器期望的方式实际命名表单域。它不希望它被称为name(或project_name)它希望它以project[name](或project[project_name])的形式通过彗星,然后将其转换为::project => {:name}(或:project => {:project_name})。 ..以真实的形式(即不是javascripty),它会从form-action获得周围的project范围......但在你的代码中你可能需要破解它并用@987654340实际命名该字段@ 或类似名称。
猜你喜欢
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多