Rails 4 Как проверить количество вложенных атрибутов (несколько изображений/картинок) с помощью несущей волны

Я новичок в stackoverflow и Rails. У меня есть три модели: User, Post, post_attachment (создать каркас post_attachment). Что я хочу сделать, так это то, что каждый пользователь сообщения (название сообщения, содержание, изображение) может загружать максимум 5 изображений (я имею в виду каждое сообщение). Я сослался на это статья для получения нескольких изображений и в основном следовал этому коду. Я также нашел эту статью для проверки вложенных_атрибутов, но только проверка изображения (вложенные_атрибуты) не работает. Любые идеи были бы хорошы. Спасибо.

User.rb:

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

Пост.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 источник


Ответы (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 изображений, он показывает сохраненное сообщение сообщения и показывает представление без изображений (потому что я изменил метод Create). Я не хотел, чтобы пост (название, контент, изображение) сохранялся, если изображение превышает 5 изображений. Вместо того, чтобы показывать вид (сообщение не должно сохранять файл), я хотел показать сообщение (максимум 5 сообщений) - person arthur; 18.04.2017
comment
В моем Post.rb у меня сейчас есть 2 валидации. проверяет :title, присутствие: true, проверяет :content, присутствие: true - 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 в PostsController # Create с неопределенным методом '[]' для nil: NilClass. - person arthur; 26.04.2017
comment
Привет Артур, Можете ли вы поделиться скриншотом ошибки, в какой строке вы получаете сообщение об ошибке. или вы можете связаться со мной по адресу [email protected], если хотите. - person t s; 26.04.2017