Обслуживание файлов через контроллер с несущей волной и ограничением с помощью Pundit gem на модели Post

Я пытаюсь загрузить файл фотографии с помощью несущей волны и ограничить (для защиты от других, которым не разрешено просматривать этот файл, и после этого выполнить это действие, пока сообщение не будет опубликовано) файл с помощью pundit.

Поэтому я создаю еще один контроллер для вложений:

class AttachmentsController < ApplicationController

  def show
    attachment = Attachment.find(params[:id])
    authorize attachment, :show?
    send_file attachment.file.path, disposition: :inline
  end

end

Моя политика вложений:

class AttachmentPolicy < ApplicationPolicy
  class Scope < Scope
    def resolve
      scope
    end
  end

  def show?
    user.try(:admin?) || record.post.has_member?(user)
  end
end

мои маршруты:

resources :attachments, only: [:show]

Я создаю папку в my_project/uploads, а затем настраиваю файл attachment_uploader.rb:

 def store_dir
    Rails.root.join "uploads/#{model.class.to_s.underscore}/" + \
      "#{mounted_as}/#{model.id}"
  end

создайте файл config/initializers/carrierwave.rb и поместите:

CarrierWave.configure do |config|
  config.root = Rails.root
end

Итак, теперь, когда я создаю новое сообщение с вложением файла, изображение больше не отображается. Раньше это можно было показать этим (в Slim):

 - if @post.attachments.any?
    .attachments
        - @post.attachments.each do |attachment|
          = link_to image_tag(attachment.file.url, class: "img-responsive img-thumbnail"), attachment_path(attachment)

И новые загруженные изображения больше не отображаются в моем сообщении. Это возможно только тогда, когда я нажимаю на ссылку этого изображения и появляется только для людей, включенных с защитой от ограничений экспертом, на пути к AttachmentsController. Например:

http://localhost:3000/attachments/3

И я пытаюсь сделать эту спецификацию сценария:

require "rails_helper"

RSpec.feature "Users can view a Post's attached files" do
  let(:user) { create(:user) }
  let(:post) { create(:post, author: user) }
  let!(:attachment) { create(:attachment, post: post, file_to_attach: "spec/fixtures/photo03.jpg") }

  before do
    assign_role!(user, :viewer, post)
    login_as(user)
  end

  scenario "successfully" do
    visit post_path(post)
    find("img[src*='photo03.jpg']").click

    expect(current_path).to eq attachment_path(attachment)
    expect(page).to have_css("img[src*='photo03.jpg']")
  end
end

И жалуется на эту ошибку:

$ rspec
...........................................F.............................

Failures:

  1) Users can view a Post's attached files successfully
     Failure/Error: expect(current_path).to eq attachment_path(attachment)

       expected: "/attachments/1"
            got: "/posts/1"

       (compared using ==)

Так что кто-нибудь может помочь мне с этим, пожалуйста? Я пытаюсь сделать что-то вроде примера электронной книги Rails 4 в действии, но в данном случае показываю изображение.

Я пробую на консоли rails это:

ap p = Post.last
  Post Load (0.2ms)  SELECT  "posts".* FROM "posts"  ORDER BY "posts"."id" DESC LIMIT 1
#<Post:0x007f9d6c036b08> {
            :id => 4,
         :title => "meus amores",
      :subtitle => "meus amores familia!!",
       :content => "meus amores familia!!",
    :created_at => Wed, 31 May 2017 23:18:56 UTC +00:00,
    :updated_at => Wed, 31 May 2017 23:18:56 UTC +00:00,
     :author_id => 1
}
=> nil

>> at = p.attachments.each do |attachment|
?> attachment.file.url
>> end
=> [#<Attachment id: 4, file: "15036286_1281339961886906_146920697557141175_n.jpg", post_id: 4, created_at: "2017-05-31 23:18:56", updated_at: "2017-05-31 23:18:56">]
>> ap at
[
    [0] #<Attachment:0x007f9d6eadadf0> {
                :id => 4,
              :file => #<AttachmentUploader:0x007f9d6eadaa58 @model=#<Attachment id: 4, file: "15036286_1281339961886906_146920697557141175_n.jpg", post_id: 4, created_at: "2017-05-31 23:18:56", updated_at: "2017-05-31 23:18:56">, @mounted_as=:file, @storage=#<CarrierWave::Storage::File:0x007f9d6eada9b8 @uploader=#<AttachmentUploader:0x007f9d6eadaa58 ...>>, @file=#<CarrierWave::SanitizedFile:0x007f9d6ead97e8 @file="/Users/romenigld/workspace/projects/news_city/uploads/attachment/file/4/15036286_1281339961886906_146920697557141175_n.jpg", @original_filename=nil, @content_type=nil>, @versions={}>,
           :post_id => 4,
        :created_at => Wed, 31 May 2017 23:18:56 UTC +00:00,
        :updated_at => Wed, 31 May 2017 23:18:56 UTC +00:00
    }
]
=> nil
>>

Таким образом, файл загружается в папку uploads. Но больше не показывал!


person rld    schedule 31.05.2017    source источник
comment
ты пишешь хорошие вопросы   -  person Fabrizio Bertoglio    schedule 08.12.2017
comment
Спасибо Fabrizio Bertoglio, эта проблема с ограничением изображения с несущей я еще не знаю. Но теперь, с новой версией рельсов 5.2, загрузка будет напрямую, и поэтому я буду смотреть в эти дни, как это сделать.   -  person rld    schedule 09.12.2017