在Rails 4中使用bang作为范围来显示404

时间:2013-08-14 14:08:42

标签: ruby-on-rails ruby-on-rails-4

我在我的应用中实现了事件类别,现在我遇到了以下问题。如果用户输入现有的URL(例如,'site / types / 1'),他将进入所需的类别,但是如果他输入site / types / asdf(一个不存在的URL),他将获得一个空的索引页面,并没有错误。我希望他得到一个404或一个错误页面,我知道如果使用'find_by!',可以通过控制器中的爆炸来实现。方法(对吗?)。但是我的查询不同,我似乎无法弄清楚原理。

如何使用范围和lambdas的更复杂查询来完成此工作?谢谢

我有以下代码:

事件控制器

  def index
    if params[:type]
      @events_future = Event.future_by_type(params[:type])
    else
      @events_future = Event.future_events 
    end
  end

事件模型

scope :future_by_type,   lambda { order(...).where(...) }

路由器

  get 'types/:type', to: 'events#index', as: :type

  resources :types, except: :show

2 个答案:

答案 0 :(得分:0)

你可以抛出404异常,Rails会自动重定向到404.html:

def index
    if params[:type]
      @events_future = Event.future_by_type(params[:type])
    else
      @events_future = Event.future_events 
    end

    #complex query here
    .......

    !@events_future.empty? || raise ActionController::RoutingError.new('Not Found')
end

答案 1 :(得分:0)

您可以以RESTful方式使用type,即

resources :types, only: [:index, :show]

TypesController

之内
def index
  @events = Event.future_events
end

def show
  @type = Type.find(params[:id]) # raises RecordNotFound if type doesn't exist
  @events = Event.future_by_type(@type)
end