0

我有一个关于如何在 Ruby 中以最佳方式实现 MVC 概念的理论问题(因为我更熟悉非 MVC -thx 的提示语言,如 ASP、PHP)。

在我的示例应用程序中,您必须管理Car及其Parts。在此之后,我将(在我看来)实现以下两个控制器:
- CarsController
- PartsController

两者都有其默认操作(索引、显示、编辑、删除)。

PartsController的“索引”动作中,所有与汽车相关的部件都会显示出来。

CarsController的“索引”操作中,所有汽车的详细信息都会显示出来,此外,我将包括PartsController的“索引”操作的内容,将汽车 id 传递给它(或会话中的那些)。

示例布局 (CarsController/show/1)
- 汽车:Porsche GT
- 品牌:Porsche
- 型号:GT
- PS:400
- 零件(来自 PartsController/index,汽车的零件之前由 CarsController 缓存):
--- 门锁
- -- 发动机 400

我尝试使用

render "cars/index"  
render :action => "cars/index"  
render :template => "cars/index"  
render :controller => "cars", :action => "index"

在我的 index.html.erb 模板中,但没有一个可以工作(我每次都会收到错误消息“模板丢失”)。

因为我已经遇到了很多麻烦,所以我认为我的概念/实现可能是错误的。

有什么建议可以找到更好的方法吗?

谢谢您的帮助 !

更新:

好的,这是一个更具体的示例。假设用户访问 localhost/cars/1。这是我的控制器的模板用于执行此操作:

应用程序/视图/汽车/show.html.erb

<%= form_for(@car) do |f| %>
  <div class="field">
    <%= f.label :brand %><br />
    <%= f.text_field :brand %>
  </div>
  <div class="field">
    <%= f.label :model %><br />
    <%= f.text_field :model %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
<%= render "parts/index" %>

app/view/parts/index.html.erb

<table>
  <% @parts.each do |part| %>
  <tr id="part-<%= part.id %>">
    <td><%= part.amount %></td>
    <td><%= part.price_total %></td>
  </tr>
  <% end %>
</table>

零件是从缓存中加载的,因此 PartsController 不需要汽车 ID(还没有)!

路线.rb

resources :cars do
  resources :parts
end

然后我会收到以下错误:

{:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]} 缺少部分部分/索引。在以下位置搜索:*“D:/Dev/Ruby/MyCRM/app/views”*“C:/Ruby193/lib/ruby/gems/1.9.1/gems/datagrid-0.5.3/app/views”

4

2 回答 2

0

你现在实际上有许多不同的问题。您的帖子的积极意义是您应该有两个控制器,如您所列出的。当您是新手时,路由(这就是 rails 处理 Web 请求的方式)是一个非常复杂的话题,但非常重要。

我建议您从本文档开始,如果您在此之后仍有问题可以再次提问。

于 2012-04-10T23:55:03.820 回答
0

就像您尝试做的事情在 Rails 中被称为“渲染部分”。

基本思想是,您有一个 html 存根(在这种情况下,是一个零件模板,用于呈现特定汽车的零件列表),并且该片段包含在一个或多个完整页面中。

render "parts/index"

不工作,因为它在部件文件夹下寻找一个名为“索引”的部分,而不是一个完整的页面按照惯例,Rails 中的局部用下划线命名。

为了让它工作,你应该创建一个部分,即 app/views/parts/_list.html.erb

第二部分是,该部分将需要访问部件列表。除非您的汽车控制器创建一个 @parts 变量,否则这将需要推断。在实践中这样做的方法是传递局部变量。因此,您将重写 _list.html.erb 以使用 'parts' 而不是 '@parts',然后在您的汽车控制器中,您将像这样呈现它:

render "parts/list", :locals => {:parts => @car.parts}

在您的零件索引中,如果您想列出所有零件,您可以像这样呈现部分:

render "list", :locals => {:parts => @parts}

有关更多信息和更详细的演练,请阅读: http: //guides.rubyonrails.org/layouts_and_rendering.html#using-partials

于 2012-04-11T16:47:08.907 回答