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"。 提前谢谢 - 皮埃尔
答案 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