我在名为“Patient”的模型上有一个表单,它通过多态关联具有“角色”。并且“角色”具有“用户”。我需要通过表单修改“用户”字段“first_name”...
class Patient < ApplicationRecord
has_one :role, :as => :roleable, dependent: :destroy
accepts_nested_attributes_for :role
end
class Role < ApplicationRecord
belongs_to :user
accepts_nested_attributes_for :user
belongs_to :roleable, polymorphic: true, optional: true
end
class User < ApplicationRecord
has_many :roles
end
class PatientsController < ApplicationController
def show
@patient = Patient.find(params[:id])
# This works just fine, so I know the data is there
puts(@patient.role.user.first_name)
end
end
如何制作包含此字段的表单?这是我到目前为止无法正常工作的内容:
<%= form_for(:patient, url: edit_patient_path(params[:id])) do |f| %>
<%= f.fields_for :role do |r| %>
<%= r.fields_for :user do |u| %>
<%= u.text_field :first_name, value: u.first_name, class: "value", disabled: false %>
<% end %>
<% end %>
<% end %>
但不幸的是,这不起作用:
undefined method `first_name' for #<ActionView::Helpers::FormBuilder:0x007f82d30c4ad8>
答案 0 :(得分:1)
首先将表单更改为left-panel
,以便它包装@patient对象。
使用<%= form_for(@patient) %>
获取表单构建器包装的对象。
.object
但是您不需要在第一个位置显式分配值,并且disabled属性默认为false:
<%= u.text_field :first_name, value: u.object.first_name, class: "value", disabled: false %>