i'm getting this error, when trying to use ajax. I did some searching, but couldn't solve my problem
我试图使用ajax时遇到此错误。我做了一些搜索,但无法解决我的问题
ActionController::UnknownFormat
Drafts Controller:
def index
if params["format"] != nil
@draft = Draft.find_by(id: params["format"].to_i)
respond_to do |format|
format.js
end
end
@draft = current_user.drafts.build
@drafts = current_user.drafts.non_submitted
@being_edited_drafts = current_user.drafts.being_edited
@completed_drafts = current_user.drafts.completed
end
index.js.erb
$('.draft_<%= @draft.id %>').trigger('click');
log:
Started GET "/drafts.132" for 127.0.0.1 at 2014-11-26 11:56:28 -0800
Processing by DraftsController#index as
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = 4 ORDER BY "users"."id" ASC LIMIT 1
Draft Load (0.4ms) SELECT "drafts".* FROM "drafts" WHERE "drafts"."id" = 132 LIMIT 1
Completed 406 Not Acceptable in 5ms
ActionController::UnknownFormat - ActionController::UnknownFormat:
actionpack (4.1.7) lib/action_controller/metal/mime_responds.rb:440:in `retrieve_collector_from_mimes'
actionpack (4.1.7) lib/action_controller/metal/mime_responds.rb:256:in `respond_to'
app/controllers/drafts_controller.rb:16:in `index'
actionpack (4.1.7) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
actionpack (4.1.7) lib/abstract_controller/base.rb:189:in `process_action'
actionpack (4.1.7) lib/action_controller/metal/rendering.rb:10:in `process_action'
actionpack (4.1.7) lib/abstract_controller/callbacks.rb:20:in `block in process_action'
activesupport (4.1.7) lib/active_support/callbacks.rb:113:in `call'
activesupport (4.1.7) lib/active_support/callbacks.rb:166:in `block in halting'
activesupport (4.1.7) lib/active_support/callbacks.rb:166:in `block in halting'
activesupport (4.1.7) lib/active_support/callbacks.rb:229:in `block in halting'
activesupport (4.1.7) lib/active_support/callbacks.rb:215:in `block in halting_and_conditional'
activesupport (4.1.7) lib/active_support/callbacks.rb:166:in `block in halting'
activesupport (4.1.7) lib/active_support/callbacks.rb:166:in `block in halting'
Create Method. This loads the index with params["format"]
创建方法。这用params [“format”]加载索引
def create
@draft = Draft.create(draft_params)
if @draft.save
redirect_to drafts_path(@draft.id),notice: "Draft was successfully saved"
else
render action: 'new'
end
end
Form where create method is called
调用create方法的表单
= form_for @draft, :html => { :multipart => true } do |f|
= f.hidden_field :user_id, value: current_user.id
#new-post-title
= f.text_field :title, :value => "<h1><b>Title</b></h2>"
#new-post-body
= f.text_area :body, :value => "<p>Start writing</p>"
.text-center
= f.submit "New Draft", :class => "btn btn-sm btn-primary btn-round"
3 个解决方案
#1
5
For one, you're still specifying instance variables after your implicit call to render
(in the respond_to
block). Those instance variable declarations should be above any rendering.
例如,在隐式调用render之后(在respond_to块中)仍然指定实例变量。那些实例变量声明应该高于任何渲染。
Also, I've seen this happen in some browsers. You can get around it by declaring a dummy render block for the html
type, so something like:
另外,我在一些浏览器中看到过这种情况。您可以通过为html类型声明一个虚拟渲染块来绕过它,所以类似于:
respond_to do |format|
format.html { render(:text => "not implemented") }
format.js
end
The html
format block will likely never get called, but its declared nonetheless.
html格式块可能永远不会被调用,但它仍然被声明。
#2
2
You need to add remote: true
to the form helper since you are trying to submit the form using ajax.
您需要将remote:true添加到表单助手,因为您尝试使用ajax提交表单。
= form_for @draft, :html => { :multipart => true }, remote: true do |f|
= f.hidden_field :user_id, value: current_user.id
#new-post-title
= f.text_field :title, :value => "<h1><b>Title</b></h2>"
#new-post-body
= f.text_area :body, :value => "<p>Start writing</p>"
.text-center
= f.submit "New Draft", :class => "btn btn-sm btn-primary btn-round"
#3
-1
This problem happened with me and sovled by just add
这个问题发生在我身上,只需添加即可
respond_to :html, :json
to application_controller.rb file
到application_controller.rb文件
You can Check Devise issues on Github: https://github.com/plataformatec/devise/issues/2667
您可以在Github上查看设计问题:https://github.com/plataformatec/devise/issues/2667
#1
5
For one, you're still specifying instance variables after your implicit call to render
(in the respond_to
block). Those instance variable declarations should be above any rendering.
例如,在隐式调用render之后(在respond_to块中)仍然指定实例变量。那些实例变量声明应该高于任何渲染。
Also, I've seen this happen in some browsers. You can get around it by declaring a dummy render block for the html
type, so something like:
另外,我在一些浏览器中看到过这种情况。您可以通过为html类型声明一个虚拟渲染块来绕过它,所以类似于:
respond_to do |format|
format.html { render(:text => "not implemented") }
format.js
end
The html
format block will likely never get called, but its declared nonetheless.
html格式块可能永远不会被调用,但它仍然被声明。
#2
2
You need to add remote: true
to the form helper since you are trying to submit the form using ajax.
您需要将remote:true添加到表单助手,因为您尝试使用ajax提交表单。
= form_for @draft, :html => { :multipart => true }, remote: true do |f|
= f.hidden_field :user_id, value: current_user.id
#new-post-title
= f.text_field :title, :value => "<h1><b>Title</b></h2>"
#new-post-body
= f.text_area :body, :value => "<p>Start writing</p>"
.text-center
= f.submit "New Draft", :class => "btn btn-sm btn-primary btn-round"
#3
-1
This problem happened with me and sovled by just add
这个问题发生在我身上,只需添加即可
respond_to :html, :json
to application_controller.rb file
到application_controller.rb文件
You can Check Devise issues on Github: https://github.com/plataformatec/devise/issues/2667
您可以在Github上查看设计问题:https://github.com/plataformatec/devise/issues/2667