2

我有一个应用程序,其中有一个 Shipment 模型。我创建了一个视图,允许我在基于表格的布局中创建货件和查看货件。一切都在 index.html.erb 中,因为所有操作都是通过 ajax 完成的。

创建货件时,默认状态为“OPEN”。稍后打印提单时,状态将变为“已打印”。

我的目标是创建另一个视图,该视图仅列出未结货物,允许操作员使用单独的表格打印提单。我的问题是 Rails 如何处理一个模型的多个表单和视图的渲染?我应该使用单独的控制器/视图来处理与打印相关的操作/视图,还是应该使用两个模型作为 ex. 装运和开运?我很难找到解释这个问题的文档。

下面列出的是我的这个模型的架构以及当前视图的目录结构。希望这有助于解释这个问题。

Shipment Model
  t.string    :item_code
  t.string    :status
  t.string    :bill_of_lading
  t.integer   :qty_shipped
  t.datetime  :ship_date
  t.datetime  :delivery_date

查看目录结构

views
   shipments
      index.html.erb
      _shipment.html.erb
      _shipment_table.html.erb
      _form.html.erb
      _edit_form.html.erb
      create.js.coffee
      edit.js.coffee
      update.js.coffee
      destroy.js.coffee     
4

2 回答 2

1

在控制器中创建一个名为 open_shipments 的新操作和一个名为 open_shipments.html.erb 的新视图文件。将新路由添加到您的路由表,并在某些视图中创建一个链接以链接新路由。

在控制器动作中,将模型对象访问到实例变量中,并在视图中从这些实例变量中显示。

祝你好运!

于 2012-06-20T04:41:37.757 回答
1

如我所见,您将展示两次相同的内容。您可以通过两种方式解决此问题:添加参数并保持相同的控制器操作,或者添加新的控制器操作(这可能会使 url 更清晰——取决于您的偏好)。

首先,您定义一个scopeon Shipment

class Shipment

  scope :open, lambda { where(:status => 'open')

end

这将允许编写如下内容:

Shipment.open

这将为您提供所有未结货物。

所以你可以定义一个新的控制器动作如下

def open_shipments
  @shipments = Shipment.open
  render :index
end

这将检索打开的货物,然后呈现与索引相同的视图。

为了使它更清晰,您可以在您的 url 中将状态作为参数。在你config/routes.rb写的

get 'shipments/status/:status', :as => 'shipments#index'

然后您必须index按如下方式编辑您的操作:

def index
  if params[:status]
    @shipments = Shipment.where(:status => params[:status])
  else
    @shipments = Shipment.all
  end
end

然后您就可以访问shipments/status/open将提供未结货件的 url,同样shipments/status/printed将提供所有打印的货件。

但是 urlshipments?status=open会给你相同的结果(不需要对路由进行任何更改)。取决于你的口味。

希望这可以帮助。

于 2012-06-20T10:49:02.223 回答