我的质量分配和强参数存在问题。在我的模型中,我有几个属性,通过我的mysql数据库中的列表示。我也有一个领域,但事实并非如此。我只需要它来计算一个值。我不想将它存储在我的数据库中。
在我的控制器中,我定义了强参数:
def timeslots_params
params.require(:timeslot).permit(:employee_id, :dienstplan_id, :start_date, :start_time)
end
但是当我试图访问控制器中的start_time属性时,我得到了
undefined method `start_time' for #<Timeslot:0x007fff2d5d8070> error.
其他已定义的db列参数存在并填充值。我是否会错过了解强大的参数并且必须定义其他内容?
编辑:这是代码,我在其中调用timeslots_params:
def create
@e = Timeslot.new(timeslots_params)
@e.start_date = @e.start_date.to_s + " " + @e.start_time.to_s
if @e.save
current_user.timeslots << @e
respond_to do |format|
format.json { render :json => @e }
end
end
end
答案 0 :(得分:3)
在您的模型中提供对start_time
字段的访问权限:
attr_accessor :start_time
如果您只需要读取权限:
attr_reader :start_time
答案 1 :(得分:1)
请仅允许您希望用户使用数据发送的参数。如果start_time不是用于更新数据库的用户数据,请使用以下方式:
params.require(:timeslot).permit(:employee_id, :dienstplan_id, :start_date)
强参数可防止用户发送的保存数据,并且您不希望他/她更新。
如果您使用:start_time,则必须在您的模型中定义。
Ops,我已经看到了你的更新:
@e.start_date = @e.start_date.to_s + " " + @e.start_time.to_s
如果您将:start_time发送到Timeslot实例,则start_time必须是Timeslot模型的方法。如果它是db字段,则由rails定义,使用attr_accesor或att_reader定义或由源模型上的def键定义。
如果不是@e.start_time
触发undefined method 'start_time'
。
再次编辑:
现在,start_time是一个模型变量。确保以与使用字段相同的方式将其发送到表单。默认情况下,我们使用f <%= f.text_field :the_field %>
。只是不要忘记f。
现在,如果您遵循我的第一个建议,您必须再次允许此字段。
答案 2 :(得分:0)
虽然Alireza的答案可行,但您也可以尝试自己定义setter方法,然后在保存之前可以使用变量。
def start_time=(time)
# use variable time to do what you want with the model
end