我有一个表单,用于保存用户设置,其中一部分是用户订购两个列表,列出他们最满意和最不满意的内容。例如:
哪些因素最重要?
您最满意的是什么?
因此,用户可以将列表拖放到自己的首选项,现在我需要对响应进行评分(将前面的数字相加)并保存前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
结束
我很困惑应该在哪里创建和实现该方法以执行逻辑并保存数据。
答案 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个主题。