ActiveStorage - создание или обновление вложения - PullRequest
0 голосов
/ 31 мая 2019

На самом деле я работаю над приложением rails, и у меня есть некоторые проблемы с ActiveStorage.

Мое приложение rails онлайн, все отлично работает. В моем приложении модель вызова Room , и каждый владелец комнаты может добавить изображение баннера .

На самом деле, если пользователь создает новую комнату, он может добавить изображение баннера, все работает, это хорошо.

Моя первая проблема - для комнаты, уже созданной до установки Active Storage , я не могу добавить изображение баннера .

Я думал, что могу повторно использовать форму, которую я использовал для Нового в Редактировании, но нет, мое вложение равно нулю.

Вторая проблема: если пользователь попытается обновить изображение, это не сработает . Пользователь должен сначала удалить, а затем добавить новый со своей страницы редактирования.

My Room.rb:

class Room < ApplicationRecord
  validates :title, uniqueness: true, presence: true, length: {maximum: 50}
  validates :description, uniqueness: true, presence: true, length: {maximum: 200}
  validates :theme, presence: true


  belongs_to :user
  belongs_to :theme

  has_many :subjects, dependent: :destroy
  has_many :rubrics, dependent: :destroy
  has_many :favorites, dependent: :destroy

  has_one_attached :header_image

  attr_accessor :remove_header_image

  # delette header image
  after_save :purge_header_image, if: :remove_header_image
  private def purge_header_image
    header_image.purge_later
  end

  # Consider room as searchable
  searchkick searchable: [:title]
end

Контроллер моей комнаты:

class RoomsController < ApplicationController

  def index
    # @rooms = Room.all
    @rooms = policy_scope(Room)
  end

  def new
    @room = Room.new
    authorize @room
  end

  def show
    @room = Room.find(params[:id])
    @favorite_exists = Favorite.where(room: @room, user: current_user) == [] ? false : true
    if params[:rubric_id]
      @subject = Subject.where(room: @room, rubric_id: params[:rubric_id])
    else
      @subject = Subject.where(room: @room)
    end
    authorize @room
    @footer_variable = true
  end

  def create
    @room = Room.new(room_params)
    @room.user_id = current_user.id
    authorize @room
    if @room.save
      redirect_to new_room_rubric_path(@room)
      RoomMailer.creation_confirmation(@room).deliver_now
    else
      render :new
    end
  end

  def edit
    @room = Room.find(params[:id])
    authorize @room
  end

  def update
    @room = Room.find(params[:id])
    @room.update(room_params)
    redirect_to room_edit_room_rubric_path(@room)
    authorize @room
  end

private

  def room_params
    params.require(:room).permit(:title, :description, :theme_id, :header_image, :remove_header_image)
  end
end

моя форма редактирования:

<div class="col-sm-7">
      <%= simple_form_for [@room], :html => { class: 'form-create'} do |f| %>
  <!-- form row 1 -->
      <span><p class="box"><i class="fas fa-clipboard-check"></i></p></span>
      <%= f.association :theme, input_html: {class: 'mt-15-n fa-select'}, prompt: 'Selectionnez un thème', collection: Theme.all, label_method: :title, value_method: :id, label: "Theme" %>
  <!-- form row 2 -->
      <span><p class="box"><i class="fas fa-rocket"></i></p></span>
      <%=f.input :title, input_html: {class: 'mt-15-n' ,:rows => 4}, :placeholder => 'Nom de votre communauté' %>
  <!-- edit header image -->
      <span><p class="box"><i class="far fa-images"></i></p></span>
  <!-- actual image -->
      <% if @room.header_image.attached?  %>
        <p class="description">Votre bannière actuelle</p>
        <%= image_tag @room.header_image.variant(resize: "300x300") %>
   <!--  delete image -->
        <p class="description">Supprimer la bannière.</p>
        <%=f.check_box :remove_header_image  %>
        <% else %>
        <p>Vous n'avez pas de banière, ajoutez une banière ci-dessous :</p>
        <%=f.file_field :header_image, :class => "asterisk" %>
      <% end %>
    <!-- form row 3 -->
      <div class="mt-20">
        <span><p class="box"><i class="fas fa-bars"></i></p></span>
        <%= f.input :description, :input_html => {class: 'mt-15-n', :rows => 5}, :maxlength =>"200", :placeholder => 'Description', hint: "Max 200 characters" %>
        <%= f.submit "Suivant", class: "btn-primary" %>
        <% end %>
      </div>
    </div>

Номера Маршруты:

rooms GET   /rooms(.:format)          rooms#index
          POST  /rooms(.:format)          rooms#create
 new_room GET   /rooms/new(.:format)      rooms#new
edit_room GET   /rooms/:id/edit(.:format) rooms#edit
     room GET   /rooms/:id(.:format)      rooms#show
          PATCH /rooms/:id(.:format)      rooms#update
          PUT   /rooms/:id(.:format)      rooms#update

Если у вас есть идея ... ?? Большое спасибо за вашу помощь!

Привет

1 Ответ

1 голос
/ 01 июня 2019

Мне не удалось воспроизвести ваши проблемы, но у меня возникла проблема с этой строкой:

after_save :purge_header_image, if: :remove_header_image

Переменная remove_header_image приходит в качестве параметра из флажка, поэтому она может быть "0" или "1", как String, а не false или true. Это означает, что он всегда оценивается в true.

Поэтому я предлагаю изменить следующим образом и посмотреть, работает ли он:

after_save :purge_header_image

private
  def purge_header_image
    header_image.purge_later if remove_header_image == '1'
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...