为页面创建不同的视图,我是正确的/ rails方式吗?

时间:2010-12-10 04:02:39

标签: ruby-on-rails ruby layout routing

Rails noob在这里寻找一些建议/方向。我有几个“页面”,我想创建这些页面的不同视图。 (例如 - 列表视图(文本列表),图库视图(缩略图)等)

但是我的方式似乎并不干净,但我是Rails的新手,所以我不知道。

这是我的设置。 routes.rb 我有:

resources :pages do
    collection do
         get :gallery
    end
    collection do
        get :list
    end     
end

在我的 pages_controller.rb

def gallery
  @pages = Page.find(:all, :order => "created_at")
end

def list
  @pages = Page.find(:all, :order => "created_at")
end 

所以这看起来很奇怪,因为我正在复制列表和图库之间的代码。

views / pages / gallery.html.erb

<% for page in @pages %>
    <div style="width:200px;height:200px;border:1px solid #DDD;float:left;margin:10px;">     
        <%= link_to page.name, page %>
    </div>
<% end %> 

views / pages / list.html.erb

<% for page in @pages %>
    <div style="width:90%;border-bottom:1px solid #DDD;margin:10px;">
        <h3><%= link_to page.name, page %></h3>
    </div>
<% end %>

一切正常。我在http://localhost:3000/pages/listhttp://localhost:3000/pages/gallery的图库视图时看到了列表视图。但是有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

首先,您可以稍微更改您的路线代码。没有必要两次指定集合:

resources :pages do
  collection do
    get :gallery
    get :list
  end     
end

为了避免在控制器中重复您的代码,您可以将Page.find代码分离为一个从before_filter调用的新方法,如下所示:

class PagesController < ApplicationController
  before_filter :find_pages, :only => [:gallery, :list]

  def gallery
  end

  def list
  end

private
  def find_pages
    @pages = Page.find(:all, :order => "created_at")
  end

这些是我将从改进开始的事情。在你的情况下,这些观点并不重要,因为我认为市长的差异就是这样。

答案 1 :(得分:2)

对于视图文件中的数据复制,您还可以创建部分文件,并可以在两个视图页面中呈现该部分文件。

可以这样做。

创建一个部分文件,假设_page.html.erb

<% for page in @pages %>
    <div style="width:200px;height:200px;border:1px solid #DDD;float:left;margin:10px;">     
        <%= link_to page.name, page %>
    </div>
<% end %> 

然后您可以在视图页面中呈现此文件

在views / pages / gallery.html.erb

`<%= render :partial => 'page'%>

在views / pages / list.html.erb

`<%= render :partial => 'page'%>

对于路线和控制器,我认为@DanneManne提出了正确的方法。

希望这可以解决您的问题。