【问题标题】:Controller action respond_to format error ActionController::UnknownFormat控制器动作 respond_to 格式错误 ActionController::UnknownFormat
【发布时间】:2018-07-24 15:08:41
【问题描述】:

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

所以,我的 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)

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

【问题讨论】:

    标签: ajax format ruby-on-rails-5 actioncontroller respond-to


    【解决方案1】:

    这可能与您在 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了解更多信息

    【讨论】:

    • 是的,我遇到了同样的错误,最近在一位朋友的帮助下,我们设法修复了它。我现在将添加此问题的解决方案。
    【解决方案2】:

    所以我的解决方案是:

     **<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)

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

      $(document).ready(function(){ $("#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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-30
      • 2020-01-29
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 2023-02-01
      • 1970-01-01
      相关资源
      最近更新 更多