2017-02-14 16 views
0

вид:Polymorpic скрепка работает странно с Rails 5

<div class="kitchen_settings"> 
<%= form_for @kitchen, :html => { :multipart => true, "data-ajax" => false} do |f| %> 
    <%= f.text_field :title,placeholder: "#{current_user.fullname}'s Kitchen", autofocus: true %> 
    <%= f.text_field :bio, placeholder: 'something about your kitchen' %> 

    <%= f.fields_for :picture do |photo| %> 
     <%= photo.file_field :avatar %> 
    <% end %> 
    <%= f.submit %> 
<% end %> 

kitchen_controller.rb

class KitchensController < ApplicationController 
    before_action :authenticate_user! 

    def new 
     @kitchen = Kitchen.new 
     @kitchen.build_picture 
    end 

    def create 
     @kitchen = current_user.build_kitchen(kitchen_params) 
    respond_to do |format| 
     if @kitchen.save 
      format.html { redirect_to dashboard_path, notice: 'Kitchen was successfully created.' } 
      format.json { render :show, status: :created, location: dashboard_path } 
     else 
      format.html { render :new } 
      format.json { render json: @kitchen.errors, status: :unprocessable_entity } 
     end 
     end 
    end 

    def show 
     @kitchen = Kitchen.find (params[:id]) 
    end 

    private 
    def kitchen_params 
     params.require(:kitchen).permit(:title,:bio, picture_attributes: [:avatar]) 
    end 
end 

kitchen.rb

class Kitchen < ApplicationRecord 
    belongs_to :user 

    has_one :picture, as: :imageable, dependent: :destroy 
    accepts_nested_attributes_for :picture 
end 

picture.rb

class Picture < ApplicationRecord 
    belongs_to :imageable, polymorphic: true 

    has_attached_file :avatar, styles: { medium: "300x300>", thumb: "100x100"}, default_url: "/assets/:style/missing.png" 
    validates_attachment :avatar, :presence => true, 
    :content_type => { :content_type => ["image/jpeg", "image/gif", "image/png"] }, 
    :size => { :in => 0..500.kilobytes } 
end 

And its giving me this error

Я хотел полиморфный модель изображения. Я решил заниматься полиморфной картинной ассоциацией, но ее просто откат всегда ... Застрял. Я добавил изображение с консоли. Благодаря!! Debugged it using binding.pry

+0

Знаете ли вы, почему ROLLBACK происходит? – emaillenin

+0

Не могли бы вы сделать журнал 'кухня' перед методом' kitchen.save'. Попробуйте также захватить ассоциацию пользователей и изображений. Это может помочь нам понять. Попробуйте logging '@ kitchen.errors', а также – Surya

+0

@emaillenin, не давая мне никаких ошибок. Не могу понять это. –

ответ

1

В Rails 5, когда мы определяем belongs_to ассоциации, необходимо иметь соответствующую запись существует по умолчанию после этого change.To изменить это поведение, я сумел сделать это таким образом:

picture.rb

class Picture < ApplicationRecord 
    belongs_to :imageable, polymorphic: true, optional: true 

    has_attached_file :avatar, styles: { medium: "300x300>", thumb: "100x100"}, default_url: "/assets/:style/missing.png" 

    validates_attachment :avatar, :presence => true, 
    :content_type => { :content_type => ["image/jpeg", "image/gif", "image/png"] }, 
    :size => { :in => 0..500.kilobytes } 
end 
0

Существует проблема с вами проверка imageable в image.rb

При сохранении кухни Alongwith изображения в один проход. Imageable проверка не удалась для изображения, так как кухня еще не создана. Вот почему это откат.

Для его подтверждения вы можете временно удалить проверку.

Вы должны использовать inverse_of, чтобы сделать эту работу

в image.rb

belongs_to :imageable, polymorphic: true , inverse_of: :image 

в kitchen.rb

has_one :picture, as: :imageable, dependent: :destroy,inverse_of: :imageable 

я добавил inverse_of в обоих ассоциации. Он сообщает рельсам, что эти ассоциации обратны друг другу, поэтому, если какая-либо из них задана, не делайте запрос для получения другого.

Таким образом, если вы установили какую-либо связь, тогда другое будет установлено автоматически, и проверка не завершится.

Here - хороший блог для использования inverse_of.

+0

Спасибо. Но это не сработало. Он просто откатывается каждый раз! –

+0

На отладку дал такую ​​же ошибку, как и раньше [скрепка] Попытка связать /tmp/6df73ba57a8324b794a7d1bb15d4e20020170214-3686-tdt3cn.png с /tmp/6df73ba57a8324b794a7d1bb15d4e20020170214-3686-h0065s.png Command :: файл -b --mime «/ TMP /6df73ba57a8324b794a7d1bb15d4e20020170214-3686-h0065s.png ' (0,4 мс) ROLLBACK => false –