Rails4没有数据库列的强参数

时间:2014-10-28 17:31:31

标签: ruby-on-rails strong-parameters

我的质量分配和强参数存在问题。在我的模型中,我有几个属性,通过我的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

3 个答案:

答案 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