控制器操作 respond_to 格式错误 ActionController::UnknownFormat

Controller action respond_to format error ActionController::UnknownFormat

我在 rails 应用的 Ruby 中遇到控制器操作响应问题。

因此,我的 taskasset_controller 中有两个简单代码的操作:

  def destroy

    if params[:id].present?
      @asset = TaskAsset.find(params[:id])
      authorize @asset, :destroy?

      @asset.destroy

      respond_to do |format|
        format.js { @asset.id }
      end
    end
  end



 def create
    @task = Task.find(params[:task_id])
    authorize @task

    respond_to do |format|
      if params[:images]
        params[:images].each { |image|
          @task.task_assets.create(image: image)
        }
      end
        @task_assets = @task.task_assets
        authorize @task_assets, :create?

      format.js { @task_assets }
    end
  end

我还定期创建了两个表单 destroy.js.erb 和 create.js.erb 并且在我从表单中删除图像时破坏的情况下我得到了已删除图像的响应 ID 以便我用来隐藏模态的信息图片预览。

但是在创建操作的情况下,我收到以下错误:

ActionController::UnknownFormat
Extracted source (around line #14):

    authorize @task

    respond_to do |format|
      if params[:images]
        params[:images].each { |image|
          @task.task_assets.create(image: image)

在创建操作响应格式的情况下我缺少什么?

这可能与您在 respond_to 块内执行某些操作而没有先调用 format.[your_format] 有关。

尝试将您的代码更改为

respond_to do |format|      
  format.js do 
    if params[:images]
      params[:images].each { |image|
        @task.task_assets.create(image: image)
      }
    end
    @task_assets = @task.task_assets
    authorize @task_assets, :create?
    render @task_assets
  end
end

或其他选项

if params[:images]
  params[:images].each do |image|
    @task.task_assets.create(image: image)
  end
end
@task_assets = @task.task_assets
authorize @task_assets, :create?

respond_to do |format|      
  format.js { @task_assets }
end

关键是你在 respond_to do |format| ... end 中唯一能做的就是调用一个或多个 format.[some_format]{ what_to_do }

查看 documentation 了解更多信息

所以我的解决方案是:

 **<script src="http://malsup.github.com/jquery.form.js"></script>**

 **<%= form_for TaskAsset.new, url: task_assets_path(format: :js),remote: true, :html => {remote: true, :multipart => true,id: 'ajaxformtask'  } do |form| %>**

   <%= hidden_field_tag :authenticity_token, form_authenticity_token %>

   <%= hidden_field_tag 'task_id', task.id %>
   <div class="form-group">
   <div class="col-md-12">
     <label>Select Images</label>
     </div>
     <%= file_field_tag "images[]", id: "imageUploadInput", type: :file, multiple: true, class:'form-control display-block' %>
   </div>

   <div class="actions">
   <div class="padding-bottom-3x text-center">

     <button type="button" id="cancel-add-task-assets" class="btn btn-lg btn-warning">Cancel</button>
     <%= form.submit "Save", id:"add-task-assets", class: 'btn btn-lg task-btn-color' %>
     </div>
   </div>
 <% end %>

 **<script>
   $(document).ready(function(){
       $("#ajaxformtask").ajaxForm()
   })
 </script>** 
  1. 添加脚本:http://malsup.github.com/jquery.form.js 到 这里的项目只是我们将其放在局部视图中的示例。
  2. 添加表单 ID 名称和(格式::js)

    {偏僻的: 真,:multipart => 真,id: 'ajaxformtask' } 做|形式| %>
  3. 添加:

    $(文档).ready(函数(){ $("#ajaxformtask").ajaxForm() })

这也是创建控制器操作的最终外观:

def create

     @task = Task.find(params[:task_id])
     #@task = policy_scope(@venue.tasks).find(params[:task_id]).decorate
     #authorize @task
     if params[:images]
       params[:images].each do |image|
         @task.task_assets.create(image: image)
       end
     end
     @task_assets = @task.task_assets
     authorize @task_assets, :create?

     @result  = [@task_assets, @venue]

     respond_to do |format|
         format.json { @task_asset.to_json }
         format.js{ @result }
           #format.js {render js: 'alert("success")'} # now you cann append that image to te image list here or create create.js.erb ...ok I have that alreday let try
       end

   end