Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RoR:如何处理自定义嵌套表单&x27;s提交_Ruby On Rails_Activerecord_Rjs_Activescaffold - Fatal编程技术网

Ruby on rails RoR:如何处理自定义嵌套表单&x27;s提交

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

我用RubyonRails定制表单,几乎一路实现了幸福,但是最后一步没有完成,因为有太多的常用词,在网上找不到答案

我相信,对于曾经做过RoR的人来说,我的问题的答案是微不足道的,但请注意,问题的表达会有点复杂

让我们看一个等价的问题

模式:

  • 出版商(id、姓名、地址)

  • 书籍(id、标题、出版商id、出版年份、单价、数量)

  • 销售日志(id、用户id、时间戳、图书id、数量、单价、注释)

自定义操作:

  • 名称:Sell(上下文:一本书)

  • 输入:
    qty
    comment
    ,(隐式输入:
    book.id
    timestamp
    ;派生输入:
    user\u id
    book.unit\u price
    book.qty

  • 结果:

    • 附加销售日志

    • 图书数量减少

  • 可能的错误:

    • 数量为非正或非整数

    • 用户输入的数量大于可用数量(账面数量)

(仅供参考:这不是关于数据库设计的问题。)

因此,我们有一个自定义表单(hidden book id;qty,comment),我们希望以类似于“编辑”书籍的行为(
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