ruby-on-rails - Ruby on Rails 基本概念总结

标签 ruby-on-rails reference conventions summary

作为 Rails 的新手,我很难找到提供 Ruby on Rails 概要的网站或引用资料。我基本了解 MVC、ActiveRecord 和类似的东西,但我很难理解其中的一些关系和基础知识。例如:

  • 我需要注意哪些命名约定?
  • Controller Action 应该如何组织和命名?
  • 在 View 中呈现信息的最佳方法是什么(通过 :content_forrender 部分)?我不应该使用哪些方法?
  • 什么应该进入助手,什么不应该?
  • 什么是常见的陷阱或我需要从一开始就正确做的事情?
  • 如何模块化代码?那是什么lib文件夹是干什么用的?

  • 关于这个问题,我已经阅读了 StackOverflow 上的一些回复,但所有回复都只是指向我需要阅读的 300 多页的书,而我只想简要总结一下重要的内容。

    我已经知道一些资源,但没有为新用户提供基本概念的简明摘要:
  • http://railscasts.com/ (好,但支离 splinter )
  • http://guides.rubyonrails.org/ (假设您已经了解所有事物之间的关系)
  • http://ruby.railstutorial.org/ (按颜色画,不好总结)
  • Rails AntiPatterns (很好,但你必须阅读整个内容才能理解任何内容)
  • The Rails 3 Way (很好,但同样,您必须阅读整本书才能理解任何内容)

  • 感谢您提供的任何帮助、引用或指导!
    P.S. I would like this wiki to become a living document, so please add to it, edit it, etc. as you feel necessary.

    最佳答案

    1. 我需要注意哪些命名约定?

    db table 是复数,model 是单数,controller 是复数。所以你有Userusers 支持的模型表,并通过 UsersController 可见.

    文件应命名为类名的wide_cased 版本。所以FooBar类需要在一个名为 foo_bar.rb 的文件中.如果您使用模块进行命名空间,则命名空间需要由文件夹表示。所以如果我们在谈论 Foo::Bar类,应该在foo/bar.rb .

    2. Controller Action 应该如何组织和命名?

    Controller Action 应该是 RESTful。这意味着您应该将 Controller 视为公开资源,而不仅仅是启用 RPC。 Rails 有一个成员操作与资源收集操作的概念。成员操作是对特定实例进行操作的操作,例如 /users/1/edit将是用户的编辑成员操作。收集操作是对所有资源进行操作的操作。所以/users/search?name=foo将是一个收集 Action 。

    上面的教程描述了如何在你的路由文件中实际实现这些想法。

    3. 在 View 中呈现信息的最佳方式是什么(通过:content_for 或呈现部分),哪些方式是我不应该使用的?
    content_for当您希望能够将 html 从内部模板附加到外部模板时应该使用它——例如,能够将 View 模板中的某些内容附加到布局模板中。一个很好的例子是添加特定于页面的 javascript。

    # app/views/layout/application.rb
    <html>
      <head>
        <%= yield :head %>
    ...
    
    # app/views/foobars/index.html.erb
    
    <% content_for :head do %>
      <script type='text/javascript'>
        alert('zomg content_for!');
      </script>
    <% end %>
    

    partials 要么用于分解大文件,要么用于多次呈现相同的信息位。例如
    <table>
      <%= render :partial => 'foo_row', :collection => @foobars %>
    </table>
    
    # _foo_row.html.erb
    
    <tr>
     <td>
      <%= foobar.name %>
     </td>
    </tr>
    

    4.什么应该进入助手,什么不应该?

    您的模板中应该只有基本的分支逻辑。如果你需要做更激烈的事情,它应该是一个助手。 View 中的局部变量是对世界上所有好的和正确的事物的厌恶,所以这是一个很好的迹象,表明你应该做一个 helper 。

    另一个原因只是纯代码重用。如果你一遍又一遍地做同样的事情,只有轻微的变化,把它拉到一个助手中(如果它是完全相同的事情,它应该是部分的)。

    5. 什么是常见的陷阱或我需要从一开始就正确做的事情?

    部分不应该直接引用实例(@)变量,因为它会阻止重复使用。始终通过 :locals => { :var_name => value } 传递数据渲染函数的参数。

    将与呈现 View 没有直接关系的逻辑排除在 View 之外。如果您可以选择在 View 中做某事,然后在其他地方做,那么 10 次中有 9 次在其他地方做是更好的选择。

    我们在 Rails 中有一个口头禅,那就是“胖模型,瘦 Controller ”。一个原因是模型是面向对象的, Controller 是天生的过程。另一个是模型可以跨 Controller ,但 Controller 不能跨模型。第三是模型更具可测试性。这只是一个好主意。

    6. 如何模块化代码?这就是 lib 文件夹的用途吗?

    lib 文件夹用于存放跨越模型关注点的代码(即不是模型,但将被多个模型使用的东西)。当你需要在里面放东西的时候,你会知道的,因为你无法弄清楚要放什么模型。在这种情况发生之前,你可以忽略 lib。

    需要记住的是,从 rails 3 开始,lib 不在自动加载路径上,这意味着您需要 require你放在那里的任何东西(或添加回来)

    一种自动要求 lib 中所有模块的方法目录:
    #config/initializers/requires.rb
    Dir[File.join(Rails.root, 'lib', '*.rb')].each do |f|
      require f
    end
    

    关于ruby-on-rails - Ruby on Rails 基本概念总结,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5205002/

    相关文章:

    ruby-on-rails - 如何将字符串转换为时间对象?

    python - 从特定内存地址/对象引用读取数据

    javascript - 使javascript引用变量成为值变量?

    javascript - ES6 可迭代的约定?

    ruby-on-rails - 如何使用uuid主键生成迁移

    ruby-on-rails - rails : Why do I get "warning: already initialized constant JSON::VERSION" when running rake cucumber?

    ruby-on-rails - Rails 3.2 应用程序中带有 Assets 管道的 HTML5 离线缓存 list 文件?

    Bash 间接变量引用

    user-interface - 双重或三重 "click to select text"功能的行为惯例?

    java - 在 Java 中围绕类型删除设计构造函数