如果用户先前已执行该操作,则禁用按钮

时间:2014-07-04 19:09:43

标签: ruby-on-rails

试图弄清楚这一段时间而不能破解坚果。

我想做的就是这个。

我有一个用户模型,它有很多答案。我想限制一个用户多次回答相同答案的能力。我已经能够在模型中阻止它,但不在视图中。

我想要提交按钮,看看current_user.id是否出现在当前的答案ID中(它正在考虑填写),如果是,请禁用提交按钮说“已经应用”。

回答#new

<%= form_for @answer do |f| %>
 <%= f.hidden_field :application_id, value: @application.id %>

 <% if @application.question_2.length && @application.question_3.length >= 1 %>
  <p>Question 1: <%= @application.question_1 %></p>
    <%= f.text_area :answer_1 %><br/>

  <p>Question 2: <%= @application.question_2 %></p>
    <%= f.text_area :answer_2 %><br/>

  <p>Question 3: <%= @application.question_3 %></p>
    <%= f.text_area :answer_3 %>

 <% elsif @application.question_2.length >= 1 %>

  <p>Question 1: <%= @application.question_1 %></p>
    <%= f.text_area :answer_1 %><br/>
  <p>Question 2: <%= @application.question_2 %></p>
    <%= f.text_area :answer_2 %><br/>

 <% else %>
   <p>Question 1: <%= @application.question_1 %></p>
    <%= f.text_area :answer_1 %><br/>
  <% end %> 

  <%= f.submit "Submit answers", data: { disable_with: "Please wait..." }  %>

 <% end %>

2 个答案:

答案 0 :(得分:0)

我看到了几个不同的部分。当我编写类似的功能时,我会考虑以下问题:

  • 页面加载/重新加载会发生什么?
  • 如果发生任何事情没有页面重新加载(即通过AJAX / JS)?
  • 应该在服务器端,客户端还是两者都禁用该操作?

首先,如果用户在页面加载时已经提交了答案,则模板应以不同方式显示该按钮。通常,在这种情况下根本不显示表单是有意义的,但如果您希望禁用该按钮的表单,则会想到以下代码(请参阅html example):

<% if @user_has_answered %>
  <%= f.submit "Submit answers", disabled: true %>
<% else %>
  <%= ... normal button ... %>
<% end %>

如果您担心在页面提交表单时阻止用户点击按钮两次,一些简单的Jquery可以轻松处理,或者您可以使用disable_with两次。这与数据库的状态无关;它只是设置一个Javascript监听器,一旦单击它(并更改其文本)就会禁用该按钮,以防止用户在页面加载缓慢时意外地双重提交。

您提到您已在模型中阻止了双重答案。控制器如何处理这个?如果用户以某种方式设法再次填写表单并提交它(可能是Javascript被禁用,并且他们在同一页面上打开了多个选项卡?如果可能,用户会这样做),你想要什么?发生在他们提交的数据上?向他们显示拒绝消息?在同一页面上保留他们的数据?如果您需要,此功能在Rails中应为80%自动,只要您处理请求和拒绝的方式与处理表单验证错误的方式相同。

如果您分享有关您正在寻找或遇到问题的详细信息,我很高兴能够更加具体。

答案 1 :(得分:0)

假设答案属于应用程序,你可以做......

<% if current_user.answers.collect(&:application).include?(@application) %>
<%= f.submit "already applied", disabled: true %>
<% else %>
<%= f.submit "Submit answers", data: { disable_with: "Please wait..." }  %>
<% end %>