Rails 4 วิธีตรวจสอบจำนวนแอตทริบิวต์ที่ซ้อนกัน (หลายภาพ/รูปภาพ) โดยใช้ Carrierwave

ฉันยังใหม่กับ stackoverflow & Rails ฉันมีสามรุ่น User, Post, post_attachment(สร้าง post_attachment scaffold) สิ่งที่ฉันต้องการทำคือ ผู้ใช้ทุกโพสต์ (ชื่อโพสต์ เนื้อหา รูปภาพ) สามารถอัปโหลดได้สูงสุด 5 ภาพเท่านั้น (ฉันหมายถึงแต่ละโพสต์) ฉันอ้างถึงสิ่งนี้ บทความ เพื่อให้ได้หลายภาพและปฏิบัติตามโค้ดนี้โดยทั่วไป ฉันยังพบบทความนี้เพื่อตรวจสอบ Nested_attributes แต่มีเพียงการตรวจสอบรูปภาพ (nested_attributes) เท่านั้น ไม่ทำงาน. ความคิดใด ๆ ที่จะได้รับการชื่นชม ขอบคุณ.

User.rb:

class User < ActiveRecord::Base
   has_many :posts, dependent: :destroy 
end

Post.rb:

class Post < ActiveRecord::Base
   belongs_to :user
   has_many :post_attachments
   accepts_nested_attributes_for :post_attachments,allow_destroy: true, reject_if: :all_blank
end

Post_attachment.rb:

class PostAttachment < ActiveRecord::Base
   mount_uploader :picture,PictureUploader 
   belongs_to :post
end

Post_controller.rb:

def new
   @post = Post.new
   @post_attachment = @post.post_attachments.build
end

def show
   @post_attachments = @post.post_attachments.all
end

def create
   @post = current_user.posts.build(post_params)

  if @post.save
    params[:post_attachments]['picture'].each do |a|
          @post_attachment = @post.post_attachments.create!(:picture => a, :post_id => @post.id)
    end
    redirect_to @post, notice: "Post Saved" 
   else
     render 'new'
  end
end

private

def post_params
   params.require(:post).permit(:title,:content,:user_id,post_attachments_attributes: [:id, :post_id, :picture, :_destroy])
end



คำตอบ (1)


คุณสามารถใส่เงื่อนไขก่อนวิธี create และ edit และใน edit.html.erb ได้ด้วย เช่นถ้าคุณต้องการบันทึกรูปภาพสูงสุด 5 รูปที่คุณสามารถใช้ได้

def create
  @post = current_user.posts.build(post_params)

  if @post.save
    ##@post_attachments = PostAttachment.find_by_post_id(@post.id) --> this can be use in edit
    ##if params[:post_attachments]['picture'].length+ @post_attachment.length <= 5
     if params[:post_attachments]['picture'].length <= 5
       params[:post_attachments]['picture'].each do |a|
          @post_attachment = @post.post_attachments.create!(:picture => a, :post_id => @post.id)
       end
     elsif params[:post_attachments]['picture'].length > 5
       flash[:error] = 'Your message'
       redirect_to YOUR_PATH
       return false
     end
     redirect_to @post, notice: "Post Saved" 
  else
   if params[:post_attachments]['picture'].length > 5
      @post.errors[:base] << "Maximuim 5 messages/pictures."
   end
   render 'new'
 end
end

คุณยังสามารถตรวจสอบมุมมองขณะแก้ไขโพสต์ของคุณได้

<% if @post_attachments.length <= 5 %>
   <%= f.file_field %>
<% end %>
person t s    schedule 17.04.2017
comment
สวัสดีขอบคุณสำหรับความช่วยเหลือ ฉันเปลี่ยนวิธีการสร้างตามที่คุณแสดงให้ฉันเห็น ดูเหมือนว่าจะใช้งานได้ แต่ฉันยังคงมีปัญหาอยู่ หลังจากที่ฉันสร้างโพสต์ที่มีน้อยกว่า 5 รูปภาพ มันจะแสดงมุมมอง (posts/show.html.erb) และ 5 รูปภาพพร้อมข้อความ โพสต์ที่บันทึกไว้(นี่คือทัศนคติที่ถูกต้อง) แต่เมื่อฉันโพสต์เกิน 5 ภาพ มันแสดงข้อความที่บันทึกไว้และแสดงมุมมองโดยไม่มีรูปภาพ (เพราะฉันเปลี่ยนวิธีการสร้าง) ฉันไม่ต้องการให้บันทึกโพสต์ (ชื่อ เนื้อหา รูปภาพ) หากรูปภาพมีมากกว่า 5 รูปภาพ แทนที่จะแสดงมุมมอง (โพสต์ควรล้มเหลวในการบันทึกไฟล์) ฉันต้องการแสดงข้อความ (สูงสุด 5 ข้อความ) - person arthur; 18.04.2017
comment
ใน Post.rb ของฉันฉันมี 2 รายการตรวจสอบแล้ว ตรวจสอบ :title, การแสดงตน: จริง, ตรวจสอบ :content, การแสดงตน: จริง - person arthur; 18.04.2017
comment
หากไม่ต้องการบันทึกโพสต์เกิน 5 ภาพ สามารถใส่ elsif params[:post_attachments]['picture'].length >= 5 flash[:error] = 'Your message..!' redirect to new return false - person t s; 18.04.2017
comment
สวัสดี ขอบคุณสำหรับคำแนะนำ !! คำตอบของคุณใช้งานได้ในบางส่วน แต่ฉันยังคงมีปัญหาอยู่ อย่างที่ฉันบอกว่าฉันมี 2 รายการตรวจสอบใน Post.rb (ชื่อเรื่อง การแสดงตน & เนื้อหา การแสดงตน) ตัวอย่างเช่น ในหน้าแบบฟอร์มของฉัน (app/views/posts/_form.html.erb) ฉันมีชื่อเรื่อง เนื้อหา เครื่องมืออัปโหลดรูปภาพ ถ้าฉันโพสต์มากกว่า 5 รูปภาพและชื่อเรื่องว่างเปล่า มันจะแสดงข้อความว่าชื่อไม่สามารถเว้นว่างได้ (เพราะการตรวจสอบความถูกต้องมาก่อน) และไม่แสดงข้อความสูงสุด 5 ข้อความ รหัสของคุณแสดงข้อความแสดงข้อผิดพลาดหากฉันเขียนชื่อและเนื้อหาที่ถูกต้อง (ไม่เว้นว่าง) โดยมีรูปภาพมากกว่า 5 รูป สิ่งที่ฉันต้องการพูดคือข้อความแสดงข้อผิดพลาดนั้นควรแสดงในรูปแบบเดียวกัน - person arthur; 25.04.2017
comment
ฉันอัปเดตคำตอบของฉัน ตรวจสอบว่าได้ผลหรือไม่ @post.errors[:base] << "Maximum 5 messages/pictures." คุณเพียงแค่เพิ่มข้อความแสดงข้อผิดพลาดที่กำหนดเองพร้อมกับข้อผิดพลาดของโมเดล Post - person t s; 25.04.2017
comment
สวัสดีคุณ ขอบคุณอีกครั้ง. คำตอบที่อัปเดตของคุณแสดงข้อความแสดงข้อผิดพลาดที่ถูกต้องหากฉันโพสต์มากกว่า 5 ภาพ แต่ถ้าฉันไม่โพสต์รูปภาพใดๆ (ว่าง) และส่ง มันจะให้ NoMethodError ใน PostController#Create ด้วยวิธีการที่ไม่ได้กำหนด '[]' สำหรับ nil:NilClass - person arthur; 26.04.2017
comment
สวัสดีอาเธอร์ คุณช่วยแชร์ภาพหน้าจอของข้อผิดพลาดได้ไหม คุณได้รับข้อผิดพลาดที่บรรทัดไหน หรือสามารถติดต่อฉันได้ที่ [email protected] หากต้องการ - person t s; 26.04.2017