【问题标题】:ajax doesn't respond - create.js.erbajax 没有响应 - create.js.erb
【发布时间】:2016-01-24 10:01:56
【问题描述】:

我正在使用 jquery-file-upload-rails gem 在我的表单上上传多个带有预览的图像。文件上传正常,但只有在浏览器刷新后才会呈现带有新照片的部分!也许,有人可以看到,出了什么问题。

我正在调用文件上传器在项目的编辑页面中加载照片图像:

= f.fields_for :photos, Photo.new do |ff|
  = ff.file_field :img_file, multiple: true, name: "project[photos_attributes][][img_file]", id: 'new_photo'

照片控制器:

  def create
    @project = Project.find(params[:project_id])
    @photo = @project.photos.create(params[:photo].permit(:img_file))
    respond_to do |format|
      format.js
      format.html
    end
  end

photos.js.coffee 让 jquery-file-uploader-rails gem 工作:

jQuery ->
  $('#new_photo').fileupload
    dataType: 'script'

create.js.erb

$('#photos').html("<%= j render(@photo) %>");

_photo.html.haml

.photo
  - @project.photos.each do |photo|
    = image_tag photo.img_file.thumb
    = link_to 'Remove', photo, data: { confirm: "Are you sure?" }, method: :delete

所以我可以上传照片。但是我的 ajax 不起作用,即使我只放了 alert('help');在我的 create.js.erb 中,它没有响应。我究竟做错了什么?非常感谢!

更新 现状(在 Rich Peck 的帮助下):

我的模型:

class Project < ActiveRecord::Base
  has_many :photos, dependent: :destroy
  accepts_nested_attributes_for :photos, allow_destroy: true
end

class Photo < ActiveRecord::Base
  belongs_to :project
  validates :img_file, presence: true
  mount_uploader :img_file, ImageUploader
end

项目控制器:

  def edit
    @project = Project.find(params[:id])
    @project.photos.build
  end

  def update
    @project = Project.find(params[:id])
    @project.update(project_params)
  end

params.require(:project).permit(photos_attributes: [:img_file])

/项目/编辑

  = form_for @project do |f|
    = f.fields_for :photos do |p|
      = p.file_field :img_file, multiple: true, id: 'new_photo'       
  #photos
    = render 'photos/photo'

/photos/_photo

.photo
  = image_tag photo.img_file.thumb if photo.img_file?
  = link_to 'Remove', photo, data: { confirm: "Are you sure?" }, method: :delete

/photos/create.js.erb

$('#photos').html("<%= j render(@photo) %>");

/javascripts/photos.js.coffee

jQuery ->
  $('#new_photo').fileupload
    dataType: 'script'

【问题讨论】:

  • 在您的表单上传中添加远程:true,这将启用 ajax 请求
  • @Marv-C,感谢您的回复!我将它添加到我的表单中,仍然无法正常工作!实际上我正在关注本教程youtube.com/watch?v=x23aIQPa-DY,它适用于具有 ajax 渲染的一个模型,但不适用于我的两个模型,虽然我可以上传图像,只是没有 ajax 渲染..
  • jquery-file-upload 不需要remote: true;它由插件处理
  • @RichPeck 你是对的。我也在尝试调试这个问题,但一点运气都没有。
  • @RichPeck,甚至可以用嵌套表单为这个插件渲染 ajax 吗?上传作品,渲染不...

标签: jquery ruby-on-rails ajax jquery-fileupload-rails


【解决方案1】:

使用

$('#photos').html(escape_javascript("<%= j render(@photo) %>"));

http://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html#method-i-escape_javascript

【讨论】:

  • 说他的.js.erb 不会触发警报,所以我怀疑语法更改会起到多大作用
  • 您是否尝试过使用 Firebug 进行调试?使用network 选项卡,您可以看到正在发送到浏览器的内容。使用错误控制台,您可以在浏览器端检测错误。
【解决方案2】:

让 ajax 文件上传在 jquery-file-upload gem 中工作

您必须在表单中添加:html =&gt; { :multipart =&gt; true}

<%= form_for Upload.new, :html => { :multipart => true} } do |f| %> ... <%end%>

请参阅jQuery-File-Upload 示例表单以供参考

【讨论】:

    【解决方案3】:

    几个问题。

    #app/controllers/projects_controller.rb
    class ProjectsController < ApplicationController
       respond_to :js, :html
    
       def new
          @project = Project.new
          @project.photos.build #-> this will replace Photo.new in fields_for
       end
    
       def create
          @project = Project.new project_params
          @project.save
          respond_with @project
       end
    
       private
    
       def project_params
          params.require(:project).permit(photos_attributes: [:img_file])
       end
    end 
    
    #app/views/projects/new.haml
    = form_for @project do |f|
        = f.fields_for :photos do |ff|
           = ff.file_field :img_file, multiple: true, id: 'new_photo'
    

    使用嵌套属性时,您永远不应该声明嵌套字段的name 属性。它不仅违反惯例,而且还为黑客和错误敞开了大门。

    如果您使用nested attributes,则需要先传递@project 对象,这意味着表单将传递给projects#updateprojects#create...不是 photos#create 你现在拥有的。

    我也强烈推荐使用responders gem,它会大量清理你的代码。

    --

    如果您想自己创建一个新的Photo 对象,您需要使用以下内容:

    #config/routes.rb
    resources :projects do
       resources :photos #-> url.com/projects/:project_id/photos/new
    end
    
    #app/controllers/photos_controller.rb
    class PhotosController < ApplicationController
       respond_to :js, :html
    
       def new
          @project = Project.find params[:project_id]
          @photo   = @project.photos.new
       end
    
       def create
          @project = Project.find params[:project_id]
          @photo   = @project.photos.new photo_params
          @photo.save
          respond_with @photo
       end
    
       private
    
       def photo_params
          params.require(:photo).permit(:img_file)
       end
    end
    
    #app/views/photos/new.haml
    = form_for @photo do |f|
       = f.file_field :img_field
    

    你的 JS 代码不正确...

    $('#photos').html("<%= j render(@photo) %>");
    

    默认情况下,Rails handles "collections" 通过调用 _[collection_singular_name].html.erb - 在您的情况下为 _photo.html.erb。它遍历集合以每次都显示这一点。要修复您的问题,只需从部分中删除循环:

    #app/views/photos/_photo.html.erb
    = image_tag photo.img_file.thumb
    = link_to 'Remove', photo, data: { confirm: "Are you sure?" }, method: :delete
    

    解决方案

    决定您是创建project 还是photo

    如果您要创建photo,则应使用单独的photos 控制器(如上所述)。如果你正在创建一个新项目,你应该正确使用nested attributes。我们之前多次使用JQuery-File-Upload(您可以sign up for free它只是一个测试应用):

    您的代码结构看起来不错,只有控制器和 JS 有问题。


    更新

    要通过项目的edit 表单添加新照片,只需使用以下内容:

    #app/controllers/projects_controller.rb
    class ProjectsController < ApplicationController
       def edit
          @project = Project.find params[:id]
          @project.photos.build
       end
    
       def update
          @project = Project.find params[:id]
          @project.update project_params
       end
    
       private
    
       def project_params
          params.require(:project).permit(photos_attributes: [:img_file])
       end
    end
    
    #app/views/projects/edit.html.erb
    <%= form_for @project do |f| %>
       <%= f.fields_for :photos do |p| %>
          <%= p.file_field :img_file %>
       <% end %>
       <%= f.submit %>
    <% end %>
    

    【讨论】:

    • 非常感谢!但是,如果我想在项目页面 (/projects/edit) 中创建 新照片 怎么办。我应该如何在那里调用这个 = form_for @photo 并渲染它们?
    • 您需要一个嵌套表单 - 如果需要,我可以对此进行更新
    • 您能否更新此内容以便从项目的编辑页面添加新照片?老实说,我有点困惑。
    • 当然,让我来。
    • 非常感谢您对我的帮助。但它仍然不起作用。现在我的文件没有附加,当我在表单上提交时,它说 缺少模板项目/更新我根据当前情况更新了我的帖子,请看一下,也许我错过了一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    相关资源
    最近更新 更多