0

我有一个Position带有字段started_at和的模型ended_at,这两个都是datetime字段。因为两者的日期部分必须相同,所以我有一个datetime_select表单字段 forstarted_at但只有一个time_select ignore_date: truefor ended_at。在create我想将日期值分配给这样的方法started_atended_at

params[:position]["ended_at(1i)"] = params[:position]["started_at(1i)"]
params[:position]["ended_at(2i)"] = params[:position]["started_at(2i)"]
params[:position]["ended_at(3i)"] = params[:position]["started_at(3i)"]

但这打破了我的控制器规范,因为我在那里直接分配了值:

describe "POST create" do
  describe "with valid params" do
    it "creates a new Position" do
      expect {
        post :create, {:position => valid_attributes}, valid_session
      }.to change(Position, :count).by(1)
    end
  end
end

所以我最终得到了这个,但我不确定这是否是一个合理的修复:

if params[:position]["ended_at(1i)"].nil? and not params[:position]["started_at(1i)"].nil? # We have to check this because in the controller specs we assign the params directly (not in this crazy xxx_at(yi) form for dates), so by checking this we know that the data was sent through the form
  params[:position]["ended_at(1i)"] = params[:position]["started_at(1i)"]
  params[:position]["ended_at(2i)"] = params[:position]["started_at(2i)"]
  params[:position]["ended_at(3i)"] = params[:position]["started_at(3i)"]
end

也许有更好的解决方案?感谢您的意见。

4

3 回答 3

1

如果控制器需要特定格式的属性,则规范应以该格式提供它们。调整valid_attributes,使其以与表单相同的方式分隔日期和时间元素,并且规范应该通过。

于 2012-08-13T18:34:33.163 回答
0

为结束日期/时间的日期和时间设置单独的列不是更容易吗?

然后有类似的东西:

模型/位置.rb

before_create :set_end_date

def set_end_date
  self[:end_date] = self[:started_at].to_date
end

规格/控制器/position_controller_spec.rb

describe "POST Create" do
  describe "with valid attr" do
     it "should create a new Position" do
       lambda do
         post :create, position: valid_attributes, valid_session
       end.should change(Position, :count).by(1)
     end
  end
end
于 2012-08-14T07:23:39.443 回答
0

你可以检查Rails.env.test?

于 2012-08-22T11:01:28.567 回答