Rails:列表和索引之间的差异

时间:2010-06-24 23:18:39

标签: ruby-on-rails list rest controller indexing

我很欣赏这是一个令人难以置信的noob问题,但谷歌搜索了多个搜索词组合我遗憾地仍然处于黑暗中。当一个人不知道时,这些事情可能很难,而当一个人知道时,这些事情就很明显。

我有半主页,传入的客户可以选择查看查询列表或执行其他一些操作。这不是主页,而是网站内的一种迷你“交换机”。

七种标准的RESTful Rails控制器方法(据我所知):

List # shows a list of records generated with .find(:all)
Show # shows details on one record
New # initiates new record
Create # saves and renders/redirects
Edit # finds and opens existing record for edit
Update # updates attributes
Delete # deletes record
  1. 当某些用户需要查看非字面上的选定“列表”时,使用什么.find(:all)?如果我仍然需要一个列表函数给我.find(:all)用于其他目的,这将如何工作?
  2. 我听说Rails控制器中使用了'index',但我不知道索引和列表之间的区别。
  3. 对于最佳实践和最佳设计,您将使用哪种控制器方法用于迷你交换机(以及其他中间页面,例如“关于我们”)?
  4. 任何具体答案都比http://guides.rubyonrails.org/action_controller_overview.html等链接更有用:)非常感谢。

1 个答案:

答案 0 :(得分:2)

首先,我认为重要的是要注意“标准方法”在某种意义上既不是标准方法也不是方法。这些被认为是行动,并且只是标准,因为它们是脚手架使用的惯例。您可以创建任意数量的操作,并使用控制器对其进行逻辑分组。

如果你打开 [Project] /config/routes.rb 并阅读评论,我想你会更好地理解控制器和动作如何映射到特定路线。例如,您可以创建一个指向登录控制器登录操作的命名路由,并通过添加到routes的顶部来调用它进行身份验证.rb:

# ex: http://localhost/authenticate
map.authenticate 'authenticate', :controller => 'login', :action => 'login'
# map.[route] '[pattern]', :controller => '[controller]', :action => '[action]'

#  ex: http://localhost/category/1
map.category 'category/:id', :controller => 'categories', :action => 'list'

# ex: http://localhost/product_group/electronics
map.search 'product_group/:search', :controller => 'products', :action => 'list'

要部分回答您的问题,您可能需要考虑添加类别模型并将所有产品与类别相关联。然后,您可以添加命名路由以按类别查看项目,如上面的代码块中所示。

使用命名路由的主要好处是您可以在视图中将其称为category_urlcategory_path。大多数人不想这样做并依赖于默认的路由映射(在routes.rb的末尾):

 # ex: http://localhost/category/view/1
 map.connect ':controller/:action/:id'

 # ex: http://localhost/category/view/1.xml
 # ex: http://localhost/category/view/1.json
 map.connect ':controller/:action/:id.:format'

这里要提到的关键是当URI匹配路由时,与符号(:id或:search)匹配的参数将传递给params哈希。例如,上面名为route的搜索会将搜索词与params[:search]匹配,因此如果您的产品有一个名为'type'的字符串列,您计划搜索,那么您的产品控制器可能如下所示:

class Products < ApplicationController
  def list
    search_term = params[:search]
    @products = Product.find(:all, :conditions => ["type = ?", search_term])
  end
end

然后,视图[Project]/app/views/products/list.html.erb可以直接访问@products

如果您真的想深入了解Ruby on Rails(可能比您发布的链接中的指南要容易10倍),您应该查看
Agile Web Development with Rails: Second Edition, 2nd Edition