Rails表单:field_for与belongs_to的多态关联

时间:2018-04-10 08:58:55

标签: ruby-on-rails

我在名为“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>

1 个答案:

答案 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 %>