简体   繁体   English

Rails simple_form选择框在验证错误时出现两次

[英]Rails simple_form select box appearing twice on validation error

I have a form that selects an association on a has_many through: relationship. 我有一种形式,它has_many through:has_many through:上选择一个关联。 It works, but when validation errors happen, it renders the select box twice for some reason. 它可以工作,但是当发生验证错误时,由于某种原因它将两次呈现选择框。

relationships.rb (Spree::Product decoration) Relationships.rb(大礼包::产品装饰)

module Products
  module Relationships
    extend ActiveSupport::Concern

    included do
      has_many :look_book_image_products, class_name: "Spree::LookBookImageProduct"
      has_many :look_book_images, through: :look_book_image_products

      def spree_product_id
        self.id
      end

      def self.for_select(relation = nil)
        relation ||= all
        relation.pluck(:name, :id)
      end
    end
  end
end

look_book_image.rb look_book_image.rb

module Spree
  class LookBookImage < Asset

    default_scope { order("#{self.table_name}.position") }

    belongs_to :look_book
    has_many :look_book_image_products, class_name: "Spree::LookBookImageProduct"
    has_many :spree_products, through: :look_book_image_products

    accepts_nested_attributes_for :look_book_image_products

    before_destroy { clear_associated_objects }
    before_save :find_dimensions, if: :attachment_updated_at_changed?

    has_attached_file :attachment, styles: { attachment: 'x200>' },
      default_style: :attachment, bucket: ENV['S3_BUCKET_NAME']

    validate :no_attachment_errors
    validates_presence_of :alt_text    
    validates :attachment, attachment_presence: true,
    attachment_content_type: {
      content_type: ['image/jpg', 'image/jpeg']
    }

    def self.table_name
      'look_book_images'
    end

    def remove_associated_product(product)
      products.delete(product)
    end

    def find_dimensions
      temporary = attachment.queued_for_write[:original]
      filename = temporary.path unless temporary.nil?
      filename = attachment.path if filename.blank?
      geometry = Paperclip::Geometry.from_file(filename)
      self.attachment_width  = geometry.width
      self.attachment_height = geometry.height
    end

    def mini_url
      attachment.url(:mini, false)
    end

    def no_attachment_errors
      unless attachment.errors.empty?
        errors.clear
        errors.add :attachment, "Paperclip returned errors for file '#{attachment_file_name}' - check ImageMagick installation or image source file."
        false
      end
    end

    def clear_associated_objects
      clear_spree_products && clear_look_books
    end

    private

    def clear_spree_products
      if spree_products
        spree_products.clear
      end
    end

    def clear_look_books
      if look_books
        look_books.clear
      end
    end
  end
end

look_book_image_product.rb look_book_image_product.rb

module Spree
  class LookBookImageProduct < ActiveRecord::Base
    belongs_to :look_book_image
    belongs_to :spree_product

    def self.table_name
        'look_book_image_products'
    end
  end
end

_form.html.erb _form.html.erb

<div data-hook="admin_image_form_fields" class="row">
  <div class="col-md-6">
    <%= f.field_container :attachment, class: ['form-group'] do %>
      <%= f.label :attachment, Spree.t(:filename) %>
      <%= f.file_field :attachment %>
    <% end %>

    <%= f.field_container :product, class: ['form-group'] do %>
      <% f.fields_for :look_book_image_products do |ff| %>
        <%= render partial: "look_book_image_product_fields", locals: { f: ff } %>
            <div class="cocoon-links">
                  <%= link_to_add_association 'Add another product', f, :look_book_image_products, class: 'btn btn-success', data: cocoon_data_options %>
                </div>
      <% end %>
    <% end %>

    <%= f.field_container :alt_text, class: ['form-group'] do %>
        <%= f.label :alt_text, Spree.t(:alt_text) %>
        <%= f.text_field :alt_text, class: 'form-control' %>
    <% end %>
  </div>
</div>

_look_book_image_product_fields.html.erb _look_book_image_product_fields.html.erb

<div class="nested-fields form-inline">
  <div class="form-group">
    <%= f.label :product, class: 'sr-only' %>
    <%= f.association :spree_product, collection: Spree::Product.for_select, as: :select, item_wrapper_class: 'form-control input-sm' %>
  </div>
    <%= link_to_remove_association "Remove", f, class: 'btn btn-danger btn-sm', data: cocoon_data_options %>
</div>

look_book_images_controller.rb look_book_images_controller.rb

module Spree
  module Admin
    class LookBookImagesController < ResourceController
      before_action :set_look_book
      before_action :set_look_book_image, only: %i(edit update destroy)

      respond_to :html

      def index
        @look_book_images = @look_book.look_book_images.all
      end

      def new
        @look_book_image = @look_book.look_book_images.build
        @look_book_image.look_book_image_products.build
      end

      def edit; end

      def create
        @look_book_image = @look_book.look_book_images.build(look_book_image_params)
        @look_book_image.attributes = look_book_image_params

        if @look_book_image.save
          flash[:success] = "Image has been created."
          redirect_to admin_look_book_look_book_images_path
        else
          invoke_callbacks(:create, :fails)
          respond_with(@look_book_image) do |format|
            format.html { render action: :new }
            format.js { render layout: false }
          end
        end
      end

      def destroy
        @look_book_image.destroy
      end

      def update_positions
        ActiveRecord::Base.transaction do
          params[:positions].each do |id, index|
            model_class.find(id).set_list_position(index)
          end
        end

        respond_to do |format|
          format.js { render text: 'Ok' }
        end
      end

      private

      def set_look_book_image
        @look_book_image = @look_book.look_book_images.find(params[:id])
      rescue ActiveRecord::RecordNotFound
        flash[:alert] = "The image you were looking for could not be found."
      end

      def set_look_book
        @look_book = LookBook.find(params[:look_book_id])
      end

      def look_book_image_params
        params.require(:look_book_image).permit(:alt_text, :attachment, :look_book_id, look_book_image_products_attributes: [:id, :look_book_image_id, :spree_product_id, :_destroy] )
      end
    end
  end
end

Any help would be much appreciated. 任何帮助将非常感激。 Cheers :) 干杯:)

Found the solution, was in the controller: 找到解决方案,在控制器中:

@look_book_image = @look_book.look_book_images.build(look_book_image_params)
@look_book_image.attributes = look_book_image_params

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM