为什么无法为控制器中的属性赋值?

时间:2013-01-22 11:24:39

标签: ruby-on-rails

我正在“使用Rails进行敏捷Web开发”一书的第13章中进行最后一次练习。

以前有一个名为“Order”的模型,我创建了一个迁移来添加一个名为“ship_date”的列:

add_column :orders, :ship_date, :datetime

然后我在orders_controller中的“create”操作中添加了一行,之后是respond_to,如下所示:

@order.ship_date = Time.now.to_date

然后我修改了这样的测试文件:

ship_date_expected = Time.now.to_date  ### new line
post_via_redirect "/orders",
                  order: { name:     "Dave Thomas",
                           address:  "123 The Street",
                           email:    "dave@example.com",
                           pay_type: "Check",
                           ship_date: Time.now.to_date } ### new line
### some existing lines
assert_equal ship_date_expected, order.ship_date  ### new line

然后我运行集成测试,但得到这样的失败:

test_buying_a_product(UserStoriesTest)[H:/Sites/rails_projects/depot/test/integration/user_stories_test.rb:56]:<Tue, 22 Jan 2013> expected but was <nil>.

我检查了数据库并确定新列存在。所以我猜这个问题是关于任务的。这应该是一个愚蠢的问题......但我不知道如何解决它。有谁可以帮助我?

THX !!!

创建动作:

def create
  @order = Order.new(params[:order])
  @order.add_line_items_from_cart(current_cart)
  @order.ship_date = Time.now.to_date

  respond_to do |format|
    if @order.save
      Cart.destroy(session[:cart_id])
      session[:cart_id] = nil
      OrderNotifier.received(@order).deliver
      format.html { redirect_to store_url, notice: I18n.t('.thanks') }
      format.json { render json: @order, status: :created, location: @order }
    else
      @cart = current_cart
      format.html { render action: "new" }
      format.json { render json: @order.errors, status: :unprocessable_entity }
    end
  end
end

2 个答案:

答案 0 :(得分:1)

请记住,在完成作业后,您需要save @order

答案 1 :(得分:0)

我遇到了同样的错误,因为我忘了更新 order_params 。 您需要向:ship_date 授予权限,否则日期值将无法保存在ship_date列中。这也是你获得 nil

的原因
 def order_params
  params.require(:order).permit(:name, :address, :email, :pay_type, :ship_date)