提问人:Leland 提问时间:9/22/2017 最后编辑:Leland 更新时间:10/16/2017 访问量:974
Rails 5 - 使用 collection_radio_buttons 打开带有嵌套模型的部分?
Rails 5 - use collection_radio_buttons to open a partial with nested models?
问:
(我的第一个 SO 问题,所以请善待!
每个附表只有一个系统; 每个系统都有许多应用程序; 每个应用程序都有许多用户和文档。
我想做什么来创建一个计划条目:
生成一个表单,该表单首先显示多个可单击的系统名称。单击系统时,它会打开一个部分,其中列出了与该系统关联的应用程序。然后,当单击特定应用程序时,将打开另一个部分,其中包含与该特定应用程序关联的用户和文档。
稍后编辑此条目时,我希望能够看到我之前输入的所有内容,并且已经预先选择了正确的系统、应用程序、用户和文档。
我在这里的问题是如何制作一个表单元素来选择一个系统,该系统将打开另一个部分 - 稍后,当我查看和/或编辑条目时,将预先选择。
现在有效的是 ,样式为 Bootstrap,当它被单击时,它会打开其关联的应用程序部分。但是,我无法从中保存系统,并且我无法确定它是否可以显示为稍后已选择的内容,例如在“编辑”窗体中。<%= link_to %>
我们正在尝试使用单选按钮(因为你不能预先选择link_to,对吧?),所以我一直在用 、 迭代 或标签 向墙上扔意大利面。但是,我无法弄清楚如何使单选按钮打开部分。f.collection_radio_buttons
f.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#new
SchedulesController#system_applications
#new
我现在卡住的地方是,渲染为“选中”,这是正确的;但它不会打开部分。该版本打开了部分,但我认为它以后不能呈现为“选中”。f.radio_button
link_to
如果我问得足够清楚,请告诉我。
答:
我认为我们做到了。一个关键的更改是 use 而不是 to to the controller,如下所示:url
href
system_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_buttons
href:
url
评论