zoukankan      html  css  js  c++  java
  • 谈一谈rails的convention over config

    Rails有一个很好的实践或者建议即convention over config,或者coding by convention,中文叫做按惯例编程,在放弃一些灵活性的前提下,可以享受到一些大师级的最优实践,这是它的出发点。在Rails里不按惯例编程,是或受到惩罚的,以下就是一个例子:

    $rails new myapp -m https://github.com/RailsApps/rails3-application-templates/raw/master/rails3-mongoid-devise-template.rb -T -O

    创建一个app,第一步是用rake spec cucumber检查是否有问题:(如果有问题,本博有文章已经介绍了如何搞定)

    $rake spec cucumber

    创建一个model:

    $rails g model Post title:string

    执行spec/cucumber(这也是一个convention):

    $rake spec cucumber

    OK. So far so good. 当创建controller的时候就有可能出问题了:

    $rails g controller Post index show new create

    请大家注意,这里我写的是Post,而其实应该是Posts,但Rails接受了这个命令,它甚至在routes里还加了几条:

    Myapp::Application.routes.draw do

    get "road/index"

    get "road/show"

    get "road/new"

    get "road/create" 

      authenticated :user do

        root :to => 'home#index'

      end

      root :to => "home#index"

      devise_for :users

      resources :users, :only => [:show, :index]

    end

    执行rake spec cucumber也都OK,一切似乎都挺正常,但当加入真实功能的时候,例如给new/create加实际功能,首先创建一个文件:app/views/post/_form.html.haml

    = simple_form_for(@post) do |f|

      = f.error_notification

     

      .form-inputs

        = f.input :title 

      .form-actions

        = f.button :submit

     

    再创建一个文件:app/views/post/new.html.haml

    %h1 New post

    = render 'form'

    = link_to 'Back', post_path

     

    至此问题才暴露:在浏览器打开http://localhost:3000/road/new时,报错:

    no methods "posts_path" in _form.html #1

    这说明rails的convention发挥了作用,要找posts_path而不是road_path,解决这个问题其实很简单:

    1、将app/controllers/post_controller.rb换名成posts_controller.rb

    2、修改spec/controllers/post_controller.rb及换名成posts_controller.rb

    3、将app/views/post换名成posts

    4、修改routes.rb:

    Myapp::Application.routes.draw do

    resources :posts

    ...

    OK了。当然你也可以重新创建一个新的controller Posts,把原来的post相关的controller全部删除。本文提供的方法可以帮助你更深刻的理解rails创建model和controller背后发生了什么。

     

     

  • 相关阅读:
    求相同号码一天内的上网流量——mapreduce
    scala初学
    对web日志文件实现按照人员、行为分类
    08 ROS阶段总结——package.xml 和 CMakeLists.txt 详细解读
    06 ROS中的节点、话题和服务
    07 ROS 的常见消息类型
    01 ROS下的三维点云数据处理(一)点云数据来源
    01 Opencv系列(一)ROS和opencv图像数据的转换
    01 ROS的运行架构——环境变量和工作空间
    02 Opencv系列(二)ROS框架下的摄像头调用方法
  • 原文地址:https://www.cnblogs.com/mobileinternet/p/2544423.html
Copyright © 2011-2022 走看看