基本Rails 404错误页面

时间:2009-09-19 03:22:45

标签: ruby-on-rails routing http-status-code-404

我一直在寻找一个简单的答案,这是一个非常漫长的时间,似乎这一点必须非常明显和简单,因为没有人有一个简单,白痴的证明教程。

无论如何,我想做的就是让一个404.html静态页面在任何错误被抛出时加载。理想情况下,这应该仅在生产和分期中进行。

我觉得这应该是最简单的事情......但我无法弄明白。

非常感谢任何帮助。

6 个答案:

答案 0 :(得分:19)

ApplicationController

unless  ActionController::Base.consider_all_requests_local
  rescue_from Exception, :with => :render_404
end

private

  def render_404
    render :template => 'error_pages/404', :layout => false, :status => :not_found
  end

现在设置error_pages/404.html然后你去

...或者我对Exception过于谨慎,你应该从RuntimeError中解救。

答案 1 :(得分:14)

我相信如果您在生产模式下运行,那么只要没有URL的路由,就会在公共目录中提供404.html。

答案 2 :(得分:7)

如果您在生产模式下运行,则只要发生相应错误,就会在公共目录中提供404.html,500.html,422.html文件,将显示上面的页面。

在rails 3.1

我们可以使用如下: Rails 3.1将自动生成具有正确HTTP状态代码的响应(在大多数情况下,这是200 OK)。您可以使用:status选项更改此设置:

  

渲染:status => 500

     

渲染:status => :禁止

Rails understands both numeric and symbolic status codes.

Fore more information see this page

干杯!

答案 3 :(得分:2)

每当抛出任何错误时,您都不会获得404,因为并非所有错误都会导致404s。这就是您的公共目录中有404,422和500页的原因。我认为rails认为这些是最常见的错误。就像Ben说的那样,当应用程序抛出错误时,404会出现无法找到的东西。在两者之间,你可以覆盖很多基地。

答案 4 :(得分:0)

另一种方法是使用以下内容配置QBRTCSession *session = [QBRTCClient.instance createNewSessionWithOpponents:opponentsIDs withConferenceType:QBConferenceTypeVideo]; if (session) { self.sessionQBRTC = session; [session startCall:nil]; } else { [SVProgressHUD showErrorWithStatus:@"Creating new session - Failure"]; }

import UIKit

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

var tableImages = [UIImage]()

var uploadButtonVisible = false

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {

    println("Image selected")
    println ("imagename= \(image)")


    self.dismissViewControllerAnimated(false, completion: nil)

    tableImages.append(image)
    println("\(tableImages)")

    collectionView.reloadData()

}


func uploadButtonOn(){
    println("Button Activated!")

    var image = UIImagePickerController()
    image.delegate = self
    image.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
    image.allowsEditing = false

    self.presentViewController(image, animated: false, completion: nil)


}




override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    println(tableImages.count)

    // append an uploadbutton if photo limit not reached
    if tableImages.count <= 6 {

        tableImages += [UIImage(named: "button.jpg")!]

    }

}


func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    println("tableImages.count is: \(tableImages.count)")
    return tableImages.count


}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell: CollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell

    cell.cellImage.image = tableImages[indexPath.row]
    return cell

}

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

    println("cell \(indexPath.row) selected")


    if indexPath.row == (tableImages.count - 1) {

        uploadButtonVisible = true

        if uploadButtonVisible {
            uploadButtonOn()
        }


    }

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

因此,只要引发config/application.rb,Rails就会将其视为常规module YourApp class Application < Rails::Application # ... config.action_dispatch.rescue_responses.merge!( 'MyCustomException' => :not_found ) end end ,呈现MyCustomException

要在本地测试,请务必将:not_found更改为:

public/404.html

详细了解config.action_dispatch.rescue_responses.

答案 5 :(得分:0)

这就是我的方法。在我的application_controller.rb中:

def render_404
  render file: 'public/404.html', layout: false, status: :not_found
end

然后,在要渲染404的任何控制器中,我都执行以下操作:

@appointment = Appointment.find_by(id: params[:appointment_id]) || render_404