如何将用户对表单的回复保存到数据库

时间:2019-08-15 17:19:18

标签: ruby-on-rails ruby activerecord

我有一个表单,用于保存用户设置,其中一部分是用户订购两个列表,列出他们最满意和最不满意的内容。例如:

哪些因素最重要?

  1. 工资(5)
  2. 余额(4)
  3. 增长(3)
  4. 津贴(2)
  5. 经理(1)

您最满意的是什么?

  1. 经理(1)
  2. 增长(2)
  3. 津贴(3)
  4. 余额(4)
  5. 工资(5)

因此,用户可以将列表拖放到自己的首选项,现在我需要对响应进行评分(将前面的数字相加)并保存前3个。(在这种情况下,应为薪金(10),余额( 8)和Perks(5)(增长也有5分,但第二个问题却少了点))

此后,用户单击提交,我要保存在user_topics表上。我已经这样创建了迁移:

class CreateUserTopics < ActiveRecord::Migration[5.0]
  def change
    create_table :user_topics do |t|
      t.belongs_to :user
      t.belongs_to :topic

      t.timestamps
    end
  end
end

和模型:

class UserTopic < ApplicationRecord
    belongs_to :user
    belongs_to :topic
end

所以我需要保存此内容,每个用户一次只能拥有3个热门主题。

我的_form_html.erb有一个提交按钮:

 <div class="actions">
    <%= f.submit "Finished", class: 'button btn-standard' %>
  </div>

哪个触发了users_controller.erb

 def update
    respond_to do |format|
      if @user.update(user_params)
        format.html { redirect_to root_path, notice: 'Your information has been updated!' }
      else
        format.html { render :core_info }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end

结束

我很困惑应该在哪里创建和实现该方法以执行逻辑并保存数据。

1 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点。

您还不清楚主题信息如何以表格形式收集并传递给控制器​​。也许您将数据作为user_params中的字段,但实际上并不对应于users表中的列。

如果是这种情况,那么我要做的就是创建一个PORO,该PORO将user_params并删除那些字段以对其进行处理并创建相关的UserTopic对象,然后返回user_params没有那些多余的字段。在将其传递给User.create之前,用户控制器会调用此PORO对参数执行操作。

如果是我,我做的事情会有所不同。不仅要保存3个最重要的主题,我还要保存用户提供的所有信息,然后每当我需要三个最重要的主题时,我都会立即对其进行计算。这样,如果您决定更改主题得分的计算方式,则无需让用户重新输入数据即可。

为此,我将使UserTopic模型具有幸福整数和重要性整数,然后将每个主题与用户给出的分数联系在一起。您也许可以使用accepts_attributes_for的形式来执行此操作,但是让用户与订购两个列表的用户一起使用它有点麻烦。

然后,我在top_topics(amount=3)类中有一个User方法,该方法进行计算以获得该用户的前n个主题。