Rails 4 Cara memvalidasi jumlah atribut bersarang (beberapa gambar/gambar) menggunakan gelombang pembawa

saya baru mengenal stackoverflow & Rails. Saya memiliki tiga model, Pengguna, Posting, post_attachment (Buat perancah post_attachment). Yang ingin saya lakukan adalah, setiap postingan (Judul postingan, Konten, Gambar) pengguna hanya dapat mengunggah maksimal 5 gambar (maksud saya setiap postingan). Saya merujuk article untuk mendapatkan banyak gambar dan pada dasarnya mengikuti kode ini. Saya juga menemukan artikel ini untuk memvalidasi nested_attributes tetapi hanya validasi gambar (nested_attributes) yang valid tidak bekerja. Setiap ide akan dihargai. Terima kasih.

Pengguna.rb:

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

Postingan.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

person arthur    schedule 16.04.2017    source sumber


Jawaban (1)


Anda dapat meletakkan kondisi sebelum metode create dan edit dan juga di edit.html.erb. seperti jika Anda ingin menyimpan maksimal 5 foto yang dapat Anda gunakan

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

Anda juga dapat memeriksa tampilan saat mengedit posting Anda.

<% if @post_attachments.length <= 5 %>
   <%= f.file_field %>
<% end %>
person t s    schedule 17.04.2017
comment
Hai, terima kasih atas bantuannya. Saya mengubah metode pembuatan seperti yang Anda tunjukkan kepada saya. Tampaknya berfungsi tetapi saya masih mengalami masalah. Setelah saya membuat postingan dengan kurang dari 5 gambar, ia menampilkan tampilan (postingan/show.html.erb) dan 5 gambar dengan pesan Posting Tersimpan (Ini adalah sikap yang benar). Tetapi ketika saya memposting lebih dari 5 gambar, itu menunjukkan posting pesan disimpan dan menampilkan tampilan tanpa gambar (karena saya mengubah metode Buat). Saya tidak ingin postingan (judul, konten, gambar) disimpan jika gambar lebih dari 5 gambar. Alih-alih menampilkan tampilan (postingan harus gagal menyimpan file) saya ingin menampilkan pesan (maksimum 5 pesan) - person arthur; 18.04.2017
comment
Di Post.rb saya, saya memiliki 2 validasi sekarang. memvalidasi :judul, kehadiran: benar, memvalidasi :konten, kehadiran: benar - person arthur; 18.04.2017
comment
Jika Anda tidak ingin menyimpan postingan lebih dari 5 gambar, Anda dapat memasukkan elsif params[:post_attachments]['picture'].length >= 5 flash[:error] = 'Your message..!' redirect to new return false - person t s; 18.04.2017
comment
Hai, terima kasih atas sarannya!! Jawaban Anda berfungsi di beberapa bagian tetapi saya masih mengalami masalah. Seperti yang saya katakan, saya memiliki 2 validasi di Post.rb.(judul, keberadaan & konten, keberadaan). Misalnya, di halaman formulir saya (app/views/posts/_form.html.erb) saya memiliki Judul, Konten, Pengunggah Gambar, jika saya memposting lebih dari 5 gambar dan judul kosong, itu menunjukkan Judul tidak boleh pesan kosong (karena validasi diutamakan) dan tidak menampilkan pesan maksimal 5 pesan. Kode Anda menampilkan pesan kesalahan jika saya menulis Judul dan Konten yang benar (tidak kosong) dengan lebih dari 5 gambar. Yang ingin saya katakan adalah pesan kesalahan harus ditampilkan dalam format yang sama. - person arthur; 25.04.2017
comment
Saya memperbarui jawaban saya. Periksa apakah itu berfungsi atau tidak. @post.errors[:base] << "Maximum 5 messages/pictures." Anda cukup menambahkan pesan kesalahan khusus dengan kesalahan model Posting Anda - person t s; 25.04.2017
comment
Hai ts. Terima kasih lagi. Jawaban pembaruan Anda memberikan pesan kesalahan yang benar sekarang, jika saya memposting lebih dari 5 gambar. Tetapi jika saya tidak memposting gambar apa pun (kosong) dan mengirimkannya, itu memberikan NoMethodError di PostsController#Create dengan metode tidak terdefinisi '[]' untuk nil:NilClass. - person arthur; 26.04.2017
comment
Hai Arthur, Bisakah Anda membagikan tangkapan layar kesalahan, di baris mana Anda mendapatkan kesalahan. atau Anda dapat menghubungi saya di [email protected] jika Anda mau. - person t s; 26.04.2017