Я пытаюсь загрузить файл фотографии с помощью несущей волны и ограничить (для защиты от других, которым не разрешено просматривать этот файл, и после этого выполнить это действие, пока сообщение не будет опубликовано) файл с помощью 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. Но больше не показывал!