为什么这不会产生404响应?
def index
if find_user
@documents = @client.documents
respond_to do |format|
format.html
format.atom { render layout: false }
end
else
flash[:error] = "#{params[:client_code]} is not a client."
render 'error', status: '404'
end
end
def find_user
@client = User.find_by_client_code(params[:client_code]) if valid_user?
end
def valid_user?
User.all.each.map(&:client_code).include?(params[:client_code])
end
就像,如果代码不正确,它应该返回404,对吧?并非例外?无法让它发挥作用。
编辑:对不起,这是错误:An ActionView::MissingTemplate occurred in share#index:
* Parameters : {"controller"=>"share", "action"=>"index", "client_code"=>"ampNDHEDD", "format"=>"atom"}
答案 0 :(得分:2)
如果您未在其他地方使用valid_user?
或find_user
方法,则可以将其移除,然后您可以执行以下操作
def index
@client = User.find_by_client_code(params[:client_code]) # returns nil or a record
if @client
@documents = @client.documents
respond_to do |format|
format.html
format.atom { render layout: false }
end
else
flash[:error] = "#{params[:client_code]} is not a client."
render status: 404
end
end
但是,您之前的评论指出您收到的模板错误表明您可能没有index.atom
模板可供呈现。
答案 1 :(得分:1)
这样做
def index
if find_user
@documents = @client.documents
respond_to do |format|
format.html
format.atom { render layout: false }
end
else
flash[:error] = "#{params[:client_code]} is not a client."
raise ActionController::RoutingError.new('Not Found')
end
end
def find_user
@client = User.find_by_client_code(params[:client_code]) if valid_user?
end
def valid_user?
User.where(client_code: params[:client_code]).present?
// User.all.each.map(&:client_code).include?(params[:client_code]) // this is terrible (Read my comment )
end
答案 2 :(得分:1)
首先,你的valid_user?
方法是一个非常糟糕的主意 - 它只是加载整个用户数据库以查看代码是否存在...这与User.find_by_client_code
的结果相同,但是没有加载每条记录!我只是修改方法和if子句。如果没有匹配的记录,它应该返回nil,它应该采用else
路径并呈现错误。
至于为什么它没有呈现错误...我不确定原子格式是否与它有关,但是当代码没有按照我期望的方式进行分支时,我总是放{{1}在分支之前我遇到了问题,并且/或者在它应该采取的分支中放置一个坏方法。这有助于缩小范围。 :d