如何从控制器中确定的值更新表行

时间:2014-08-12 05:23:03

标签: ruby-on-rails

ruby​​_on_rails rails 4分配非屏幕数据以插入记录

不是使用屏幕值(例如simple_form_for @user_evaluation_result)来填充列以插入行,而是需要计算控制器中的某些值。 例如,如果我在控制器中有这些语句

….
# which if I had simple_form_for user_evaluation_result would get populated by the screen 
@user_evaluation_result = UserEvaluationResult.new(user_evaluation_result_params)
….
# standard stuff I use for screen derived updates
def user_evaluation_result_params
    params.require(:user_evaluation_result).
        permit(:evaluation_assumption_id,
               :company_listing_id,
               :target_share_price_dollars )
  end

如何将值分配给:user_assumption_id等,以便插入有效。我尝试了各种各样的陈述。或者,我是否使用其他格式而不是调用" def user_evaluation_result_params"。 提前谢谢 - 皮埃尔

1 个答案:

答案 0 :(得分:1)

我希望我能正确地解释这个问题......

首先,要确保我们位于同一页面上...... user_evaluation_result_params方法中的代码正在使用强参数来创建ActionController::Parameters对象,以保护您的模型免受不允许的群体分配。因此,通常,当您从视图模板中的表单创建或更新ActiveRecord对象时,您希望使用强参数,以便用户无法操纵您的表单来设置您不期望的属性。

也就是说,如果要在对象上设置属性,则不必使用质量赋值。以下是使用一次性分配(与质量分配相反)的示例:

obj = MyObject.new
obj.attr_one = "One"
obj.attr_two = "Two"
obj.save

这种方法没有任何问题,除了它对于一般情况来说有很多工作要做。因此,大规模分配只会让我们不必一直这样做。但听起来这个一次一个分配就是你在这种情况下想要的。所以尝试这样的事情:

def create
  @user_evaluation_result = UserEvaluationResult.new
  # assuming you have a UserAssumption object instance in `my_user_assumption`
  @user_evaluation_result.user_assumption = my_user_assumption
  @user_evaluation_result.some_other_attr = "some value"
  @user_evaluation_result.save
end

请注意,正如您所问,不是直接设置@user_evaluation_result.user_assumption_id,而是像我上面那样设置实际的对象关联。尽量保持质量分配之外的关联,并使用对象关系来构建对象图。

或者,如果您有来自表单的某些属性,您可以混合使用这两种方法:

def create
  @user_evaluation_result = UserEvaluationResult.new(user_evaluation_result_params)
  # assuming you have a UserAssumption object instance in `my_user_assumption`
  @user_evaluation_result.user_assumption = my_user_assumption
  @user_evaluation_result.some_other_attr = params[:user_evaluation_result][:some_other_attr]
  @user_evaluation_result.save
end

private

def user_evaluation_result_params
  params.require(:user_evaluation_result)
        .permit(:evaluation_assumption_id,
                :company_listing_id,
                :target_share_price_dollars)
end