使用remote:true

时间:2018-06-01 09:30:22

标签: ruby-on-rails ruby

我有模态窗口,您需要报告错误消息。所以,我有这个窗口的HTML代码

<div class="modal">
    <div id="modal-6">
    <%#= render @p::ErrorReport %>
        <div class="box_m box_m_middle" style="margin: 0 auto;">
                <div class="report_error">
                    <div class="name">Report an error</div>
                    <div class="arcticmodal-close close"></div>
                    <p class="info_block">Some info block</p>
                    <div class="error_explanation">Email is wrong</div>
                    <div class="message_send">Message sent</div>
                    <p class="thanks">Thank you!</p>
                    <div class="form">
                        <%= form_for @image, url: error_create_url, method: :post, remote: true do |f| %>

                        <div class="row">
                            <div class="box1 blocks">
                                <%= f.label :name, class: "label" %>
                                <%= f.text_field :user, class:"int int2", placeholder: "" %>
                            </div><!--
                    /--><div class="box2 blocks">
                                <%= f.label :Email, class: "label" %>
                                <%= f.text_field :email, class:"int int2", placeholder: "" %>
                            </div>
                        </div>
                        <div class="row">
                            <%= f.label :Message, class: "label" %>
                            <%= f.text_area :message, class:"int int2", placeholder: "Please write about your problem" %>
                        </div>
                        <div class="rows">
                            <div class="box1 blocks">
                                <div class="file">
                                    <!-- <div>Attach file</div> -->
                                    <i class="i i_paper_clip"></i>
                                    <%= f.file_field :file , class: 'choose_file' %>
                                    <img id="error_report_image">
                                </div>
                            </div><!--
                    /--><div class="box2 blocks">
                                <%= f.submit "Send", class: 'btn btn_middle btn_radius5' %>
                                </div>
                            </div>
                        <% end %>
                    </div>
                </div>
        </div>
    </div>
</div>

我有从这个模态窗口处理Ajax的js代码。要使用Ajax,我使用remote:true。

function error_report_init(){

  var modal6 = $('#modal-6')
  var incorrect_mail = $('.error_explanation')
  error.click(function(){
    error_show()
  })
  $('body').on('ajax:success', function(data, status, xhr) {
    if (status == 'ok') {
      console.log('status: ', status)
      incorrect_mail.hide()
      modal6.find('.form').hide()
      modal6.find('.report_error .message_send').show()
      modal6.find('.report_error .thanks').show()
      modal6.find('.info_block').hide()
      modal6.find('.name').hide()
    } else {
      incorrect_mail.show()
    }
  })
  $('body').on('ajax:error', function(data, status, xhr) {

  })
}

和控制器

class Desktop::Vision::ErrorController < CatalogController
  domain_layout 'page_screen'

  def form
    @image = Image.new
  end

  def create
    @image = Image.new(image_params)

      if @image.save
        ::Mailer::FromSite.error_report(@image).deliver_later
        # Mailer::FromSite.error_report_alias(@image).deliver_later
        render_status 'ok' 
      else
        render_status @image.errors.full_messages
      end
    end
  end

    def reported
    end

    private

    def image_params
        params.require(:image).permit(:user, :email, :message, :file)
    end

  def render_status status
    render plain: status
    return
  end
end

问题是,如果我尝试填充字段一切正常,我得到另一个模态窗口:“发送消息”。但是当我尝试附加一些文件时,一切都变坏了,并且远程:真的有效非常奇怪。因为我没有得到模态窗口,只能在另一个新页面中获得控制器答案:“render_status'ok'”或“render_status @ image.errors.full_messages”(当电子邮件不正确时)并且Ajax不起作用。我不知道为什么当我尝试附加文件时Ajax不起作用

1 个答案:

答案 0 :(得分:2)

要使用 remote:true ,请在相应的视图文件夹中创建 create.js.erb 文件,然后在该文件中移动所有ajax处理函数。

您不需要render_status @image.errors.full_messages

而不是这个,在控制器中使用如下所示:

respond_to do |format|
  format.html {  render_status 'ok' }
  format.js
end