Проблемы при загрузке изображения через скрепку в альтернативной модели

Состав

У меня есть таблица изображений, к которой многие другие таблицы имеют внешние ключи. Мой стол TeamMember имеет image_id ссылка на таблицу изображений.

Образ

class Image < ActiveRecord::Base
  belongs_to :user
  has_attached_file :asset

  validates :user_id, presence: true
end

Участник команды

class TeamMember < ActiveRecord::Base
  belongs_to :project
  belongs_to :user

  has_one :image, as: :attachable
  accepts_nested_attributes_for :image

  validates :project_id, presence: true
  validates :user_id, presence: true
  validates :image_id, presence: true
  validates :name, presence: true, length: { maximum:75 }
  validates :description, presence: true, length: { maximum: 255 }

  after_initialize :init

  def init
    self.removed = false if self.removed.nil?
  end
end

контроллер

def create
  @pteam_member = TeamMember.new(team_member_params)
  @pteam_member.user_id = get_current_user.id

  if @team_member.save
    redirect_to action: :show, id: @team_member.id
  else
    set_project
    render action: :new
  end
end

def team_member_params
  params.require(:team_member).permit(:name, :description, :image, :project_id)
end

Посмотреть

<%= form_for @team_member, url: team_members_path(params[:project_id]), html: { multipart: true } do |f| %>
      <div class="form-group">
        <%= f.label :name %>
        <%= f.text_field :name, { class: "form-control" } %>
      </div>

      <div class="form-group">
        <%= f.label :description %>
        <%= f.text_area :description, { class: "form-control", rows: 6 } %>
      </div>

      <div class="form-group">
        <%= f.label :image, 'Photo' %>
        <%= f.fields_for :image_attributes do |image_fields| %>
          <%= image_fields.file_field :asset %>
        <% end %>
      </div>

      <div class="actions">
        <div class="btn-group">
          <button type="submit" class="btn btn-success">save <span class="glyphicon glyphicon-floppy-saved"></span></button>
        </div>
      </div>
  <% end %>

проблема

Неважно, что я пытаюсь, я не могу получить :image сохранить как часть :team_member, Я получаю ошибку ActiveRecord:: AssociationTypeMismatch:

Ожидается изображение (#70132078464480), получен ActionDispatch::Http::UploadedFile(#70132082679240)

Куда я иду не так? Чего мне не хватает, я подхожу к этому неправильно?

1 ответ

Решение

Вам необходимо прикрепить файл к объекту изображения, связанному с team_member. Что вы на самом деле делаете, так это пытаетесь связать файл напрямую с team_member как ассоциацию изображений - что не сработает. Поскольку вы используете nested_attributes, вы можете исправить это, просто изменив формат запроса. Вместо,

<%= f.file_field :image %>

Использовать этот:

<%= f.fields_for :image_attributes do |image_fields| %>
  <%= image_fields.file_field :asset %>
<% end %>

И измените свои параметры в белом списке соответственно.

Другие вопросы по тегам