Rails 5 - 使用 collection_radio_buttons 打开带有嵌套模型的部分?

Rails 5 - use collection_radio_buttons to open a partial with nested models?

提问人:Leland 提问时间:9/22/2017 最后编辑:Leland 更新时间:10/16/2017 访问量:974

问:

(我的第一个 SO 问题,所以请善待!

每个附表只有一个系统; 每个系统都有许多应用程序; 每个应用程序都有许多用户和文档。

我想做什么来创建一个计划条目:

生成一个表单,该表单首先显示多个可单击的系统名称。单击系统时,它会打开一个部分,其中列出了与该系统关联的应用程序。然后,当单击特定应用程序时,将打开另一个部分,其中包含与该特定应用程序关联的用户和文档。

稍后编辑此条目时,我希望能够看到我之前输入的所有内容,并且已经预先选择了正确的系统、应用程序、用户和文档。

我在这里的问题是如何制作一个表单元素来选择一个系统,该系统将打开另一个部分 - 稍后,当我查看和/或编辑条目时,将预先选择。

现在有效的是 ,样式为 Bootstrap,当它被单击时,它会打开其关联的应用程序部分。但是,我无法从中保存系统,并且我无法确定它是否可以显示为稍后已选择的内容,例如在“编辑”窗体中。<%= link_to %>

我们正在尝试使用单选按钮(因为你不能预先选择link_to,对吧?),所以我一直在用 、 迭代 或标签 向墙上扔意大利面。但是,我无法弄清楚如何使单选按钮打开部分。f.collection_radio_buttonsf.radio_button<input type="radio">

自从第一次发布这个问题以来,我已经将范围缩小到在循环中使用。稍后编辑条目时,它显示为正确“选中”,但它仍然无法打开部分。f.radio_button

这是来自以下部分的片段:/_schedule_form.html.erb

<%= form_for @schedule do |f| %>

  <% System.all.each do |a| %>

   <!-- This link_to makes the Applications partial appear, but that's all it does -->
    <%= link_to a.system_nm, system_applications_path(:system_id => a.id, 
    :schedule_id => params['id']), :title => 'Click to choose system', 
    :class -> 'btn btn-default btn-flat active', data: {:remote => true, 
    'data-target' => '#applicationList'} %>
     </a>  <!-- closes the link_to tag, I believe -->
    <% end %>

      <div id="applicationList">
         <!-- the Applications partial renders here -->
      </div>

   <% end %>

下面是打开部分的文件:system_applications.js.erb_system_applications.html.erb

$("#applicationList").html("<%= escape_javascript(render 
    'system_applications', locals: {applications: @applications, 
    schedule_applications_array: @schedule_applications_array})%>");

以下是可能提供线索的更新:我现在正在使用这个嵌入式 Ruby 代码:

<% System.all.each do |rt| %>
  <label>
    <%= f.radio_button :system_id, rt.id, data:{:remote => true, 'data-target' => 
   '@applicationList'}, href: system_applications_path(:system_id => rt.id, 
   :schedule_id => params['id']), class: 'remote-input', onclick: 
   "#applicationsList" %>
  </label>
<% end %>

而且,当我单击该单选按钮时,我在浏览器控制台中收到一个 JS 错误,该错误指向呈现的 HTML,特别是行尾:Uncaught SyntaxError: Invalid or Unexpected Token>

<input data-remote="true" data-data-target="#applicationList" href="/schedules/system_applications/24?schedule_id=122" class="remote-input" onclick="#applicationList" type="radio" value="24" checked="checked" name="schedule[system_id]" id="schedule_system_id_24" />

只是为了让它更复杂:当创建一个 NEW 条目时,当我将鼠标悬停在其中一个按钮上时,我会得到一个看起来很干净的路径,例如 ,这就是单击时发送到服务器的内容(然后将参数读取为 .但是将鼠标悬停在标签上不会显示任何路径,单击它会发送带有 参数 .这会触发一个(这是有道理的,因为该 URL 没有路径)。参数需要相同吗?如果是这样,我是怎么搞砸的?link_to/schedules/system_applications/24{"system_id"=>"24"}f.radio_button"/schedules/new?schedule%5Bsystem_id%5D=24"{"schedule"=>{"system_id"=>"24"}}500 (Internal Server Error)

此外,单击单选按钮会将请求发送到 ,而单击link_to会将其发送到 。我不明白我是如何告诉单选按钮将其发送到的。SchedulesController#newSchedulesController#system_applications#new

我现在卡住的地方是,渲染为“选中”,这是正确的;但它不会打开部分。该版本打开了部分,但我认为它以后不能呈现为“选中”。f.radio_buttonlink_to

如果我问得足够清楚,请告诉我。

单选按钮 ruby-on-rails-5 unobtrusive-javascript 集合-select

评论


答:

0赞 Leland 10/16/2017 #1

我认为我们做到了。一个关键的更改是 use 而不是 to to the controller,如下所示:urlhrefsystem_applications_path

<% @systems.each do |a|
  <label class="btn btn-sm btn-default">
    <%= f.radio_button :system_id, a.id, :data => {url:system_applications_path(:system_id 
    => a.id, :schedule_id => params['id']), 'data-target' => '#applicationList'+a.id.to_s,
    :remote => true} %>
    <%= a.system_nm %>
  </label>
<% end %>

现在,当我单击单选按钮时,它会打开正确的部分,并且在我稍后编辑条目时显示为选中。Bootstrap 样式 () 有助于显示有多少可点击区域,但基本功能不需要它。btn btn-sm btn-default

我想其中一些著名的 Rails Magic 的处理方式与 .但它之所以“神奇”,只是因为我不理解它(还——成长心态!这背后的解释是什么?radio_buttonshref:url