MeetController#update中的ActionController :: UnknownFormat

时间:2016-11-11 21:19:18

标签: ruby-on-rails

我已经阅读了关于这个问题的无数SO问题,但找不到解决方案。

我有一个更新会议的按钮:

 <%= form_for(meeting) do |f| %>
   <%= f.hidden_field :accepted, value: true %>
   <%= button_tag(type: 'submit', class: "btn_primary") do %>
        Accept <svg><use xlink:href="#checkmark"/></svg>
   <% end %>
 <% end %>

我收到一个未知的格式错误,但它仍然会更新。导致此错误的原因是什么?

我尝试从更新方法中删除respond_to do |format|。这解决了这一个按钮的问题,但随后打破了调用会议/更新的平台上的所有其他按钮。

class MeetingsController < ApplicationController

 respond_to :json, :html 

  def update
    respond_to do |format|    **error highlights this line**
      if @meeting.update(meeting_params)
        format.json { render :show, status: :ok, location: @meeting }
      else
        format.html { render :edit }
        format.json { render json: @meeting.errors, status: :unprocessable_entity }
      end
    end
  end
 end

控制台:

Started PATCH "/meetings/224" for 127.0.0.1 at 2016-11-11 16:05:27 -0500
Processing by MeetingsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"hK6AoOZuw9DWyKUXw1dXWOSUolooWgBUPnkItUJX5Tm7XvimsHd9518pkqwVvNhUi3L3vlA4OZaJZiAgrbS0Ig==", "meeting"=>{"accepted"=>"true"}, "button"=>"", "id"=>"224"}
  User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
  Meeting Load (0.2ms)  SELECT  "meetings".* FROM "meetings" WHERE "meetings"."id" = ? LIMIT 1  [["id", 224]]
   (0.3ms)  begin transaction
  SQL (0.5ms)  UPDATE "meetings" SET "accepted" = ?, "updated_at" = ? WHERE "meetings"."id" = ?  [["accepted", "t"], ["updated_at", "2016-11-11 21:05:27.882521"], ["id", 224]]
   (1.3ms)  commit transaction
Completed 406 Not Acceptable in 24ms (ActiveRecord: 2.7ms)

ActionController::UnknownFormat (ActionController::UnknownFormat):
  app/controllers/meetings_controller.rb:65:in `update'

这从来都不是问题,似乎从不出现在哪里。这个错误的原因是什么?谢谢!

2 个答案:

答案 0 :(得分:2)

我想我知道问题是什么。我在你的更新方法中添加了一行

class MeetingsController < ApplicationController

respond_to :json, :html 

def update
 respond_to do |format|    **error highlights this line**
   if @meeting.update(meeting_params)
     format.html { redirect_to some_rails_path }
     format.json { render :show, status: :ok, location: @meeting }
   else
     format.html { render :edit }
     format.json { render json: @meeting.errors, status: :unprocessable_entity }
   end
  end
 end
end

您收到未知格式错误但仍然成功更新会议的原因是因为您的方法具有可靠的逻辑,因此它正在更新会议,但是一旦它执行了此操作,您只会告诉它该怎么做JSON的术语但不是HTML的术语,您可以在else语句中解决这两个问题,但是如果更新成功则不会。

答案 1 :(得分:1)

这应该是ajax请求吗?它似乎不是。但是你要渲染json而不是html。如果您要允许页面重新加载,则需要向if @meeting.update(meeting_params)添加html选项

类似于:format.html { redirect_to @meeting, notice: 'Meeting was successfully updated.' }

如果您正在执行ajax请求,这不是正确的答案,但我在您的问题中没有看到任何迹象表明您是。如果你需要进一步澄清,请注意。