我有一个应用程序,我有一个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
答案 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
会给你相同的结果(不需要对路线进行任何更改)。取决于你的口味。
希望这有帮助。