Rails 3.1一个模型的不同视图

时间:2012-06-20 04:37:54

标签: ruby-on-rails model-view-controller ruby-on-rails-3.1

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

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

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

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

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     

2 个答案:

答案 0 :(得分:1)

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

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

祝你好运!

答案 1 :(得分:1)

如我所见,你将两次展示同样的东西。您可以通过两种方式解决此问题:要么添加参数,要么保持相同的控制器操作,要么添加新的控制器操作(可能会生成更清晰的URL - 取决于您的偏好)。

首先,您在scope上定义Shipment

class Shipment

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

end

这样可以写出如下内容:

Shipment.open

这将为您提供所有未开放的货件。

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

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

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

为了使其更清晰,您可以将状态设置为网址中的参数。 在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,同样shipments/status/printed将提供所有已打印的货件。

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

希望这有帮助。