Ruby on rails RoR:如何处理自定义嵌套表单&x27;s提交
我用RubyonRails定制表单,几乎一路实现了幸福,但是最后一步没有完成,因为有太多的常用词,在网上找不到答案 我相信,对于曾经做过RoR的人来说,我的问题的答案是微不足道的,但请注意,问题的表达会有点复杂 让我们看一个等价的问题 模式:Ruby on rails RoR:如何处理自定义嵌套表单&x27;s提交,ruby-on-rails,activerecord,rjs,activescaffold,Ruby On Rails,Activerecord,Rjs,Activescaffold,我用RubyonRails定制表单,几乎一路实现了幸福,但是最后一步没有完成,因为有太多的常用词,在网上找不到答案 我相信,对于曾经做过RoR的人来说,我的问题的答案是微不足道的,但请注意,问题的表达会有点复杂 让我们看一个等价的问题 模式: 出版商(id、姓名、地址) 书籍(id、标题、出版商id、出版年份、单价、数量) 销售日志(id、用户id、时间戳、图书id、数量、单价、注释) 自定义操作: 名称:Sell(上下文:一本书) 输入:qty,comment,(隐式输入:book.id
出版商(id、姓名、地址)
书籍(id、标题、出版商id、出版年份、单价、数量)
销售日志(id、用户id、时间戳、图书id、数量、单价、注释)
- 名称:Sell(上下文:一本书)
- 输入:
,qty
,(隐式输入:comment
,book.id
;派生输入:timestamp
,user\u id
,book.unit\u price
)book.qty
- 结果:
- 附加销售日志
- 图书数量减少
- 可能的错误:
- 数量为非正或非整数
- 用户输入的数量大于可用数量(账面数量)
update
)来实现它。所做的(几乎就是一切):
--books\u controller.rb:添加了自定义数量显示列
--books_helper.rb:
def custom_qty_display_column(record)
record.qty.to_label + " ["
link_to( "Sell..." \
, { :controller => "books", :action => "sell_form", :id => record.id, :page => false } \
, { :position => "replace", :inline => true, :class => "action" } \
) \
+ "]"
end
--视图/书籍/出售表格.erb(仅关键详细信息)
当前进度
当我在图书列表条目上单击“销售…”链接时,条目消失,出现的是自定义表单,而不是它。在表单上,“取消”链接(和[X]按钮)工作正常;“提交”按钮起作用(输入正确时操作成功完成)
不存在的是形式仍然存在。理论上,我应该在标有Q1
、Q2
和Q3
的地方返回相应的javascript。我不想手工进行逆向工程和编写Java脚本,因为在框架升级时,我将被迫重做这一步。我希望以最简单和可维护的方式生成必要的Javascript。正如我现在相信的那样,我的观念还不错
版本信息
- JRuby 1.5.0
- 宝石
- 轨道2.3.4
- activerecord 2.3.4
- activesupport 2.3.4
(如果还需要什么,请告诉我)
部分结果
# ...
if errors.empty?
render :action => 'on_update.js'
else
# ...
end
# ...
应用程序使用的是哪个Rails版本?
应用程序使用的javascript库是什么?
Book和SellLog是RESTful资源吗
它们是您不在帮助器中使用链接到远程
和控制器操作中使用响应到
块的原因吗
对于使用prototype的Rails 2.3,我是这样做的:
in controller:
def sell
# …
# book / quantity / errors
# …
respond_to do |format|
if errors.empty?
format.js {render :update do |page|
page.replace_html '_ID_OF_DOM_OBJECT_CONTAINING_ROW_INFO_', :partial => '_PARTIAL_FOR_ROW_INFO_LAYOUT_'
end}
format.html { redirect_to :action => _WHATEVER_THE_SUCCESS_ACTION_IS_ }
else
format.js {render :update do |page|
page.replace_html 'form', :partial => '_DOM_ID_OF_FORM_'
end}
format.html { render :action => _WHATEVER_ACTION_DISPLAYED_THE_FORM_ }
end
end
end
_行信息布局的部分内容应包括:
<div id="_ID_OF_DOM_OBJECT_CONTAINING_ROW_INFO_">
<!-- row display markup -->
</div>
当遵循Rails约定时,您所做的很多事情都会变得更容易,但我不知道您的Rails版本、应用程序DSL,或者您的应用程序使用了哪些插件和/或gems来解释控制器中的当前模式。步骤1:您必须修改助手中的链接,以包含eid
link_to( "Close..." \
, { :controller => "books", :action => "sell_form", :id => record.id, :page => false, :eid => @controller.params[:eid] } \
, { :position => "replace", :inline => true, :class => "action" } \
)
步骤2:您必须修改sell_表单.erb
并在url
中设置parent_模型
、parent_列
、嵌套
和eid
。您必须将update
设置为book\u list
,并且必须使用元素从\u id()
为表单生成正确的HTML id
我在问题的末尾添加了版本信息<代码>行信息布局的部分应该有一些简单的渲染方法。如果我调试成功的“编辑”(update
)操作的响应,我会看到大量javascript。我希望有人知道生成这些代码所需的几行代码。我继续挖掘,当我有结果时会发布我自己的结果。差点忘了!你的回答仍然教会我们很多!谢谢:-)啊。。。没有抓住问题的重点。反正是结束了,因为这是一场为期一周的战斗。我希望它对整个宇宙都有价值。请参阅编辑日志
<div id="_ID_OF_DOM_OBJECT_CONTAINING_ROW_INFO_">
<!-- row display markup -->
</div>
link_to( "Close..." \
, { :controller => "books", :action => "sell_form", :id => record.id, :page => false, :eid => @controller.params[:eid] } \
, { :position => "replace", :inline => true, :class => "action" } \
)
<%
form_remote_tag( \
:url => { :controller => :books, :action => :sell, :id => params[:id], :parent_column => "books", :parent_model => "Publisher", :nested => "true", :eid => params[:eid] } \
, :update => :book_list \
, :html => { :id => element_form_id(:action => :update) } \
) do
%>
if request.xhr?
if @record.valid?
render :action => 'on_update.js'
else
render :action => 'form_messages.js'
end
else
if @record.valid?
return_to_main
else
render :action => 'sell_form'
end
end