2

モデルに has_one 関係 (組織には 1 つのテンプレートがあります) があり、フォームを介して更新しようとしています。ただし、そうすると、次のエラーが表示されます。

ActiveRecord::AssociationTypeMismatch in OrganizationsController#update

Template(#70209323427700) expected, got String(#70209318932860)

モデルに示すように、各組織には多くのテンプレートが関連付けられていますが、現在のテンプレートは 1 つしかないため、これは少し複雑です。

class Organization < ActiveRecord::Base
  validates :subdomain, :presence => true, :uniqueness => true
  validates :current_template, :presence => true


  has_many :organization_assignments
  has_many :people
  has_many :pages
  has_many :templates
  has_many :users, :through => :organization_assignments
  has_one :current_template, :class_name => 'Template'


  attr_accessible :name, :subdomain, :template_id, :current_template, :current_template_id
end

これが私のフォームです:

= simple_form_for @organization, :html => { :class => 'form-horizontal' } do |f|
  - @organization.errors.full_messages.each do |msg|
    .alert.alert-error
      %h3
        = pluralize(@organization.errors.count, 'error')
        prohibited this organization from being saved:
      %ul
        %li
          = msg

  = f.input :name

  = f.input :subdomain
  = f.input :current_template, :collection => @organization.templates, :selected => @organization.current_template

  .form-actions
    = f.submit nil, :class => 'btn btn-primary'
    = link_to t('.cancel', :default => t("helpers.links.cancel")), organizations_path, :class => 'btn'

そして、私のコントローラーは次のとおりです。

  def update
    @organization = Organization.find(params[:id])

    respond_to do |format|
      if @organization.update_attributes(params[:organization])
        format.html { redirect_to @organization, notice: 'Organization was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @organization.errors, status: :unprocessable_entity }
      end
    end
  end

ネストされたフォームを使用してみました:

  = simple_fields_for :current_template do |f|
    = f.input :current_template, :collection => @organization.templates, :selected => @organization.current_template

しかし、関連するフォームを実際に変更せずに、ID # を変更するだけで成功します。私は何が欠けていますか?

4

1 に答える 1

2

問題は、params[:organization][:template] の値が、選択したテンプレートの ID を含む文字列であることです。その ID を持つ Template の実際のインスタンスを検索し、params[:organization][:template] に割り当てる必要があります。例えば:

def update
  @organization = Organization.find(params[:id])
  if (params[:organization])
    params[:organization][:template] = Template.find(params[:organization].delete(:template))
  end

  respond_to do |format|
    if @organization.update_attributes(params[:organization])
    # ...
  end
end
于 2012-07-30T03:12:10.167 に答える