Как использовать Carrierwave в accepts_nested_attributes_for - PullRequest
1 голос
/ 26 июня 2019

У меня есть это в сообщении класса (который является классом модели)

accept_nested_attributes_for mount_uploader: message_pictures, PictureUploader

пока в классе message_controller у меня есть

def new
    @message = current_user.messages.build if logged_in?
    @message.message_pictures.build
    @reciever = User.find_by(params[:id])
  end

  def create
    @message = current_user.messages.build(message_params)

    if @message.save
      # Try saving the pictures
      flash[:success] = "Message sent"
      redirect_to messages_path
    else
      flash.now[:danger] = "Message not sent"
      render 'new'
    end
  end

и приватный метод message_params (все еще в message_controller)

private
    def message_params
      params.require(:message).permit(:content, :receiver, :sender, 
        :archive, message_pictures_attributes: [:msg_img_url, :message_id])#, message_pictures_attributes:[:msg_img_url, :message_id]
    end

находясь в режиме просмотра сообщений, я сделал это.

<h1>Compose a new message</h1>
<div class="row">
    <div class="col-md-6 col-md-offset-3">
        <%= form_for(@message, html: { multipart: true }) do |f| %>

          <%= render 'shared/error_messages', object: @message %>

          <%= f.label :content %>
          <%= f.hidden_field :receiver, value: @reciever %>
          <%= f.hidden_field :sender, value: current_user.id %>
          <%= f.text_area :content, size:"20x15" %>
          <%= f.submit "Send message", class: "btn btn-primary" %> 

          <span class="message_pictures">
            <%= f.fields_for :message_pictures do |mp| %>
              <%= mp.file_field :msg_img_url, accept: 'image/jpeg,image/gif,image/png' %>
            <% end %>   
          </span>
        <% end %>
        <%= button_to "Save message", archive_messages_path %>
        <script type="text/javascript">
            $('#message_picture').bind('change', function() {
                var size_in_megabytes = this.files[0].size/1024/1024;
                if (size_in_megabytes > 1) {
                    alert('Maximum file size is 1MB. Please choose a smaller file.');
                }
            });
        </script>

        <p>Want to go back to inbox? <%= link_to "Inbox", messages_path %></p> Or 
        <p>Want to go back to the home page? <%= link_to "Home", root_path, class: "btn btn-lg btn-primary" %></p>
    </div>
</div>

Без использования Carrierwave, он работает отлично, и это ошибка, которую он выдал

ArgumentError в MessagesController # new

Не найдено ассоциации для имени `remote_message_pictures_url = '. Это уже определено?

Указывает на строку 5 в классе модели, который является

accept_nested_attributes_for mount_uploader: сообщения_картины, PictureUploader

...