【问题标题】:How to submit two separate forms in Rails?如何在 Rails 中提交两个单独的表单?
【发布时间】:2017-07-20 14:05:47
【问题描述】:

我有一个注册表单,并希望在提交第一个表单后将用户发送到可选的第二个表单。

Rails 如何知道第二次提交与第一次表单提交相关联?我有点了解 Active Record 关联(has_many,belongs_to),但我不太了解会话。

我可以将第二个表单的值放在一个表格中

class SecondFormAnswers < ActiveRecord::Base
   belongs_to :user
end

Rails 会自动将用户会话从第一个表单提交链接到第二个表单提交吗?

【问题讨论】:

  • 你可以使用jQuery,使用.submit()回调,你可以通过它发送另一个表单。

标签: ruby-on-rails forms


【解决方案1】:

您可以通过accepts nested attributes 收集关联模型的属性。您可以使用fields for 构建表单。

你可以把它放在 User 类中

accepts_nested_attributes_for :second_form_answers

然后在用户表单中,您可以使用fields_for 通过输入收集值。

f.fields_for :second_form_answers do |second_form_answer|
    second_form_answer.input :attribute

然后您可以隐藏页面上的第二个表单。如果他们想完成表单的第二部分,他们可以单击一个按钮并用 JQuery 显示它。

$(document).on(ready, function() {
    $('.second-form-button').on('click', function() { 
        $('.second-form').show();
    });
});

您也可以在接受嵌套属性上执行reject_if: :all_blank。这样,如果他们决定不做第二部分,如果所有输入均为空白,则嵌套属性将不会对其进行评估。

accepts_nested_attributes_for :second_form_answers, reject_if: :all_blank

【讨论】:

  • 即使第二个没有完成,第一个表单是否仍会提交到数据库?
  • 在同一页面上隐藏第二个表单是我的想法。我试图弄清楚在重定向到第二种形式后如何做。我很欣赏你的回应。既然我理解了,我就可以按照你描述的方式去做!
  • 如果您不想担心所有输入都为空白的情况下的第二个表单,您可以在接受嵌套属性上执行如果空白则拒绝。 reject_if: :all_blank 我会修改答案...
  • 感谢埃里克。我有一些学习要做。你让我走上了一条好路。我很感激。
  • 不客气。祝你好运!如果这对你有用,请选择它作为选择的答案。
【解决方案2】:

为此使用单独的模型是一种糟糕的做法。

您应该将 User.id 保存到控制器中的 cookie 中。

假设您正在创建一个新用户:

class User < ApplicationController

  def create
    @user = User.create(user_params)
    session["user_id"] = @user.id

    redirect_to edit_user_path(@user)
  end

  def edit
    @user = User.find(session["user_id"])
    @user.update(user_params)
  end

end

当然,这只是为了详细说明问题的解决方案。您应该根据自己的逻辑对其进行调整。但也许您甚至可以向您的ApplicationController 添加方法,例如current_user(作为辅助方法),以从session[:user_id] 值中获取User 记录。

【讨论】:

  • “为此使用单独的模型是一种糟糕的做法。”著名的。我打算再次走这条路,因为我的用户可以拥有_many 产品。不过,这不适用于第二种形式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多