0

我正在尝试通过 Rails 中的更新操作来更新布尔值,尽管我一生都无法让它工作。

Users有一个questionnaire_complete默认为 false 的布尔字段。当他们更新他们的调查问卷(提交它 - 它是在其他地方创建的)时,我告诉控制器将其切换为 true,以使他们能够在其他地方重新提交。

def update
  if @user.form_reached # Another boolean used for path control - which works perfectly with the same toggle!
    current_user.toggle!(:questionnaire_complete) # The failing line
    SomeMailer.submission_confirmation(@user).deliver_now
    redirect_to user_answer_path(@user), notice: "Thank you for submitting your form"
  end
end

我知道这大部分都是在 Mailer 发送时实现的,并且重定向/通知完全按照它们应该的方式工作。唯一缺少的是(至关重要的)切换。

表单本身很简单simple_form_for @user,可以完全按照应有的方式更新属性。

这只是切换。这太痛苦了。任何建议都受到热烈欢迎:)

更新

我已将其更改为将隐藏字段放入表单中,以便更仔细地检查参数。我感觉这可能是因为我也在更新表单中的嵌套属性,因为参数看起来与使用这种方法应该完全一样:

形式:

<%= simple_form_for @user do |user| %>
  <%= user.input :questionnaire_complete, :as => :hidden, :input_html => { :value => true } %>
  <%= user.simple_fields_for :user_answers do |user_answer| %>
     <li>
      <%= user_answer.text_field :answer %></br>
      </li>
  <% end %>
  <%= user.submit %>
<% end %>

参数:

"user"=>{"questionnaire_complete"=>"true", "user_answers_attributes"=>{"0"=>{"answer"=>"example", "id"=>"194"}...}
4

1 回答 1

2

看起来你只是有一个错字

current_user.toggle!(:questionnaire_submitted)

在您的原始帖子中,您说用户有一个questionaire_submitted字段,但在您的控制器中您正在调用它questionnaire_complete

编辑:
如果它继续让您头疼,您可以自己直接切换属性。

current_user.update(questionnaire_complete: !current_user.questionaire_complete)

事实上,我建议这样做,因为它似乎#toggle!跳过了验证。尽管还值得注意的是,由于您正在切换它,如果用户再次输入此路线(并且form_reached为真),您将设置questionnaire_complete为假,这(没有任何关于您要完成的工作的其他信息)似乎是奇怪的事情(而不是仅仅将其设置为真)。

于 2015-05-13T14:25:01.073 回答