如果用户不存在则返回404

时间:2014-08-04 01:49:40

标签: ruby-on-rails ruby-on-rails-3

为什么这不会产生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"}

3 个答案:

答案 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