ruby-on-rails 禁用Simple_form按钮

oxf4rvwz  于 2023-05-08  发布在  Ruby
关注(0)|答案(1)|浏览(124)

我是Rails的新手,如果这是一个简单的问题,我很抱歉:(使用Rails 7)
我有一个简单的_form如下:

<%= simple_form_for investment, url: investment_path(investment), method: :patch do |f| %>
  <tr>
    <td style="width: 5%;"><%= f.input :user_id, 
                                        collection: User.all.map { |u| [u.initials, u.id] }, 
                                        label: false, 
                                        input_html: { class: 'form-control', style: 'font-size: 12px;' } %></td>
    <td style="width: 15%;"><%= f.input :institution_id, 
                                        collection: Institution.all.to_a, 
                                        label: false, 
                                        input_html: { class: 'form-control', style: 'font-size: 12px;' } %></td>
    <td style="width: 15%;"><%= f.input :investment_type_id, 
                                        collection: InvestmentType.all.to_a, 
                                        label: false, 
                                        input_html: { class: 'form-control', style: 'font-size: 12px;' } %></td>
    <td style="width: 15%;"><%= f.input :fin_benchmark_id, 
                                        collection: FinBenchmark.all.to_a, 
                                        label: false, 
                                        input_html: { class: 'form-control', style: 'font-size: 12px;'  } %></td>
    <td style="width: 30%;"><%= f.input :name, 
                                        as: :text, 
                                        label: false, 
                                        input_html: { class: 'form-control', style: 'outline: none, font-size: 12px', rows: '1' } %></td>
    <td style="width: 15%;"><%= f.input :investment_number, 
                                        label: false, 
                                        input_html: { class: 'form-control', style: 'font-size: 12px' } %></td>
    <td style="width: 15%;"><%= f.input :risk, 
                                        label: false, 
                                        input_html: { class: 'form-control', style: 'font-size: 12px' } %></td>
    <td><%= f.input :track_return, label: false %></td>
    <td><%= link_to 'Show', investment %></td>
    <td><%= f.submit 'Update', class: 'btn btn-primary' %></td>
  </tr>
<% end %>

当我单击Update按钮时,表单中所做的更改将被提交,DB也将被更改。这也将我重定向到一个“Show”页面(就像在许多Rails示例中一样)。“显示”页面有一个链接,指向加载此表单的索引。
当返回表单时,所有按钮都不再工作,它们都被禁用。我已经谷歌了这个,发现我应该添加数据:{ disable_with:false }。我做到了,但仍然,按钮仍然被禁用。让按钮重新工作的唯一方法是刷新页面。
当我们回到这个页面时,如何使按钮工作?

v6ylcynt

v6ylcynt1#

Rails正在努力不重新加载您的页面。它使用它的最新玩具Turbo,劫持所有链接和提交从正常的HTML操作,而是使用缓存和远程表单提交和浏览器历史记录和一堆其他技巧,以避免昂贵的页面重新加载。
因此,您返回的表单页面仍然处于您离开时的“状态”。这意味着,表单已经提交,按钮已经被禁用,所以你不能意外地提交两次。
你可以做一些事情来告诉Rails你实际上需要刷新:
1.关闭以下表单的Turbo:

<%= simple_form_for investment, url: investment_path(investment), method: :patch, data: { turbo: false } do |f| %>

这应该会强制show页面为完全重定向和页面加载。并且 * 应该 * 修复返回到索引视图的问题。
1.关闭从show到index的链接上的Turbo,这也应该强制加载整个页面:

<%= link_to investments_path, data: { turbo: false } %>

1.在索引页面上使用自定义呈现来强制只重新加载表单。
1.在表单上使用turbo frame,当从show视图返回到index视图时,使用turbo stream管道输入新表单以替换已提交的表单。
我确信DHH希望您执行#4,关闭Turbo确实会有惩罚:你实际上是在重新加载你的页面,这很慢而且代价很高。

相关问题