我在Ruby中知道我可以respond_to?
用来检查对象是否有某种方法.
但是,鉴于课程,我如何检查实例是否有某种方法?
即,像
Foo.new.respond_to?(:bar)
Run Code Online (Sandbox Code Playgroud)
但我觉得有必要比实例化一个新实例更好的方法.
在使用以下代码的rails控制器操作中:
respond_to do |format|
format.json{ render :json=> {:status => 200, :response=>@some_resource} }
format.html { redirect_to(some_resource_path)}
end
Run Code Online (Sandbox Code Playgroud)
如何记录控制器将解析的格式,即"HTML"或"json"?format
是Collector类型.有没有办法获得表示格式的字符串?
在我的rails应用程序中,我有一个ajax请求到服务器,以存储一些数据.这曾经没有任何问题,但现在我收到一个错误:
ActionController::UnknownFormat (ActionController::UnknownFormat):
app/controllers/reservations_controller.rb:45:in `create'
Run Code Online (Sandbox Code Playgroud)
以下是控制器和我的javascript文件,其中我声明数据类型是JSON
class ReservationController < ApplicationController
respond_to :html, :json
def create
...
respond_to do |format|
if @reservation.save
format.html do
redirect_to '/'
end
format.json { render json: @reservation.to_json }
else
render 'new'
end
end # respond_to
end # create
end # ReservationController
Run Code Online (Sandbox Code Playgroud)
function.js
$.ajax({
url: url_link,
dataType: 'json',
type: 'POST',
data: dataToSend
})
Run Code Online (Sandbox Code Playgroud)
完整的错误日志是:
Completed 406 Not Acceptable in 45ms
ActionController::UnknownFormat (ActionController::UnknownFormat):
app/controllers/bookings_controller.rb:45:in `create'
Rendered /Users/tiagovieira/.rvm/gems/ruby-2.0.0-p451/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_source.erb (0.5ms)
Rendered /Users/tiagovieira/.rvm/gems/ruby-2.0.0-p451/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (0.8ms)
Rendered /Users/tiagovieira/.rvm/gems/ruby-2.0.0-p451/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.8ms)
Rendered /Users/tiagovieira/.rvm/gems/ruby-2.0.0-p451/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout …
Run Code Online (Sandbox Code Playgroud) 我有一个控制器"UserController",应该响应正常和ajax请求http://localhost:3000/user/3
.
当它是正常请求时,我想渲染我的视图.当它是一个AJAX请求时,我想返回JSON.
正确的方法似乎是一个respond_to do |format|
障碍.编写JSON很简单,但是如何让它响应HTML并像往常一样呈现视图?
def show
@user = User.find(params[:id])
respond_to do |format|
format.html {
render :show ????this seems unnecessary. Can it be eliminated???
}
format.json {
render json: @user
}
end
end
Run Code Online (Sandbox Code Playgroud) 我正在使用Ruby on Rails 3,我想知道以下代码中的:location => ...
和head :ok
语句含义,它们如何工作以及如何使用它们.
respond_to do |format|
format.xml { render :xml => @user, :status => :created, :location => @user }
end
respond_to do |format|
format.xml { head :ok }
end
Run Code Online (Sandbox Code Playgroud) 如果我有这样的代码块:
def show
@post = Post.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @post }
end
end
Run Code Online (Sandbox Code Playgroud)
我该如何添加类似的内容
format.json
Run Code Online (Sandbox Code Playgroud)
任何提示,指示,想法都欢迎...
这是一个问题"为什么这样做",而不是"我如何使这项工作".
我的应用程序正在调用返回JSON的第三方REST API,并将结果作为我自己的 JSON API的一部分返回.
我使用的是Rails 3 respond_to
和respond_with
方法; 在GET
请求的情况下,这正如我所期望的那样工作,只是通过JSON.
在这种情况下POST
,它会做更多,包括从返回的对象中生成一个URL来传递一个:location
选项.但由于我的对象只是JSON(不是ActiveRecord),我收到错误.
例如...
# POST /api/products.json with params id=:id
def create
query_string = "#{user_id}&id=#{params[:id]}"
@products = third_party_api_wrapper.products(query_string, 'POST')
respond_with @products
end
Run Code Online (Sandbox Code Playgroud)
我的第三方API的包装器发出一个POST请求,返回正常,然后Rails返回500错误,记录如下:
NoMethodError (undefined method `{"response":{"message":"product 4e1712d9ec0f257c510013f8 selected"}}_url' for #<MyController>
Run Code Online (Sandbox Code Playgroud)
Rails希望我的@products对象知道如何创建位置URL.
澄清:@products
第三方API返回的对象是纯JSON - 一个字符串,您可以在上面的错误日志消息中看到它.发生此错误是因为Rails似乎希望对象更多 - 在Rails内部API支持中,它是一个ActiveRecord对象.
如果我respond_with
用旧式替换新的sytax
respond_to do |format|
format.json { render :json => @products } # note, no :location or :status options
end
Run Code Online (Sandbox Code Playgroud)
一切正常.这就是我所做的,所以我没有"如何"的问题,而是有一个"为什么"的问题.
什么时候有
def some_action
respond_to do |format|
format.html {}
format.js {}
format.json { respond_with @objects}
end
end
Run Code Online (Sandbox Code Playgroud)
看起来像html行和js行自动提供/调用匹配动作名称的文件.并且html和js提供一个或另一个,而不是两者.它是否正确?
如果你的js中有一个被调用的ajax调用,它会调用json,它会请求数据,这些需要数据来响应,对吗?我是否需要它来响应json和js,或只是一个?
如果你不回复,并省略所有类型,它默认是否响应html和js?
当我在控制器中执行respond_to而不是每个动作中的respond_to块时,是否使用respond_with @objects
apply to any argument(:thml,:js,:xml,:json等)?
替代语法:
class TheController < ApplicationController
respond_to :html, :js, :json, only: [:some_action, :other_action]
def some_action
respond_with @objects
end
end
Run Code Online (Sandbox Code Playgroud)
备用语法如何工作?
如果您使用备用语法,您是否可以对不同类型的请求做出不同的响应?如果要以不同的方式响应,是否必须执行respond_to阻止而不是替代语法?这些案例中的每一个如何解决html的优雅降级问题?
我的控制器中有两个动作:
def find
@item = Item.find(params[:id])
render 'result', :id => @item.id
end
def result
@item = Item.find(params[:id])
respond_to do |format|
format.js
end
end
Run Code Online (Sandbox Code Playgroud)
问题在于我先调用find
动作,然后调用result
动作但是采用html格式.所以'format.js`永远不会被触发.
如何在find
动作结束时呈现result
js格式的动作?
非常感谢 !
在respond_to
你可以设置flash[:notice]
这样的
respond_to do |format|
format.html { redirect_to photo_path(photo), :notice => 'The photos was saved') }
format.xml { render :xml => photo, :status => :created}
end
Run Code Online (Sandbox Code Playgroud)
我试图设置flash [:success] :success => "yay"
但它不起作用.
难道我做错了什么?