micropost.rb
class Micropost < ActiveRecord::Base
belongs_to :user
default_scope -> { order(created_at: :desc) }
mount_uploader :picture, PictureUploader
validates :user_id, presence: true
validates :tag1, presence: true, length: { maximum: 20 }
validates :tag2, presence: true, length: { maximum: 20 }
validates :tag3, presence: true, length: { maximum: 20 }
validates :picture, presence: true
validate :picture_size
validates :ispublic, inclusion: { in: [ true, false ] }
private
# Validates the size of an uploaded picture.
def picture_size
if picture.size > 5.megabytes
errors.add(:picture, "should be less than 5MB in size.")
end
end
end
microposts_controller.rb фрагмент:
def create
@micropost = current_user.microposts.build(micropost_params)
if @micropost.save!
flash[:success] = "Post created!"
redirect_to root_url
else
@feed_items = []
render 'static_pages/home'
end
end
def micropost_params
params.require(:micropost).permit(:tag1, :tag2, :tag3, :picture, :ispublic)
end
Тест с ошибкой:
tag1 = "This"
tag2 = "Is"
tag3 = "Sparta"
image = File.open("test/fixtures/p_avatar.png")
assert_difference 'Micropost.count', 1 do
post microposts_path, params: {micropost: { tag1: tag1, tag2: tag2, tag3: tag3, picture: "image",
ispublic: false }}
end
Ошибка теста:
Validation failed. Picture can't be blank.
Я использую CarrierWave ... на основе других ответов Мне было интересно, не могу ли я использовать проверку presence: true
с изображением, но я думал, что @micropost.save
просто хранить что угодно как строку (varchar). В целях тестирования я просто хочу убедиться, что передана правильная строка, но, возможно, в этом даже нет необходимости, если достаточно проверки CarrierWave и picture_size.