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/list和http://localhost:3000/pages/gallery的图库视图时看到了列表视图。但是有更好的方法吗?
答案 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提出了正确的方法。
希望这可以解决您的问题。