我有一个只有html模板(例如jobs.html.erb )的Rails 2.1.2站点,所以当我请求restful资源时:
www.mysite.com/jobs/1
但是,如果我请求,它会以html形式呈现我的工作:
www.mysite.com/jobs/1.xml
我知道错误:
视图路径c:/
/mysite/app/ view中缺少模板作业/show.xml.erb
更糟糕的是,我也可以要求
www.mysite.com/jobs/1.xyz
事实上,我看到了错误:
在查看路径c:/
/mysite/app/视图中缺少模板作业/show.xyz.erb
要严格地只显示html内容,最干净和最简单的方法是告诉Rails我不想呈现.html.erb文件以外的任何东西。
必须指出的是:
如果解决方案不是在render/responds_to级别,因为我需要修改大量的操作,那就太好了。也许有一种方法可以配置Rails,以便只呈现html模板?
发布于 2009-11-03 17:13:32
如果不想使用responds_to,可以这样做:
class ApplicationController < ActionController::Base
before_filter :allow_only_html_requests
...
def allow_only_html_requests
if params[:format] && params[:format] != "html"
render :file => "#{RAILS_ROOT}/public/404.html"
end
end
...
end
这将在所有请求之前运行,并且只允许那些根本不指定格式或指定html格式的请求通过。如果您想返回406,您可以创建一个public/406.html,这是不可接受的。
发布于 2009-11-03 17:08:52
在您的路线中,您可以简单地删除这条线:
map.connect ':controller/:action/:id.:format'
而".xyz“将不再被路由,从而导致404个错误/。
发布于 2010-03-18 05:43:36
您可以使用Rails Per覆盖功能。这是什么?
class UsersController < ApplicationController::Base
respond_to :html, :xml, :json
# Override html format since we want to redirect to a different page,
# not just serve back the new resource
def create
@user = User.create(params[:user])
respond_with(@user) do |format|
format.html { redirect_to users_path }
end
end
end
:除了和:只有选项
您还可以传入:以外和:only选项,以仅支持特定操作的格式(如对before_filter所做的那样):
class UsersController < ApplicationController::Base
respond_to :html, :only => :index
respond_to :xml, :json, :except => :show
...
end
:任意格式的
如果仍希望在单个操作中使用respond_to,请使用:任意资源格式,该格式可用作与任何未指定格式的通配符匹配:
class UsersController < ApplicationController::Base
def index
@users = User.all
respond_to do |format|
format.html
format.any(:xml, :json) { render request.format.to_sym => @users }
end
end
end
https://stackoverflow.com/questions/1671111
复制