1

我是 ruby​​ on rails 的新手,我一直在阅读 Agile web development with rails 书。我正在研究迭代 B1:验证,当我进行测试时,我对符号 :product 感到非常困惑。问题是关于 ":product => @update" 我真的不知道这是什么意思以及 :product 符号来自哪里。我知道它是一个散列,但它散列到哪个表?它到底在这里做什么?代码如下。先感谢您。

require 'test_helper'

class ProductsControllerTest < ActionController::TestCase
  setup do
    @product = products(:one)
    @update = {
      :title       => 'Lorem Ipsum',
      :description => 'Wibbles are fun!',
      :image_url   => 'lorem.jpg',
      :price       => 19.95
    }
  end

  test "should get index" do
    get :index
    assert_response :success
    assert_not_nil assigns(:products)
  end

  test "should get new" do
    get :new
    assert_response :success
  end

  test "should create product" do
    assert_difference('Product.count') do
      ***post :create, :product => @update***
    end

    assert_redirected_to product_path(assigns(:product))
  end

  # ...

  test "should show product" do
    get :show, :id => @product.to_param
    assert_response :success
  end

  test "should get edit" do
    get :edit, :id => @product.to_param
    assert_response :success
  end

  test "should update product" do
    put :update, :id => @product.to_param, :product => @update
    assert_redirected_to product_path(assigns(:product))
  end

  # ...

  test "should destroy product" do
    assert_difference('Product.count', -1) do
      delete :destroy, :id => @product.to_param
    end

    assert_redirected_to products_path
  end
end
4

1 回答 1

1

这个结构没有什么神奇之处。这@update是一个引用哈希的变量名。哈希在您的测试文件中较早声明。

@update = {
  :title       => 'Lorem Ipsum',
  :description => 'Wibbles are fun!',
  :image_url   => 'lorem.jpg',
  :price       => 19.95
}

此散列包含应传递给控制器​​中的update操作的新数据。products由于变量的命名方式,这令人困惑。一个更好的名字可能会有所帮助:

@product_attributes

products#update操作需要一个包含更新数据的散列。该数据用于更新对象。

测试中的以下行...

post :update, :product => @update

对应于您的产品控制器中可能有的这条线:

if @product.update_attributes(params[:product])

注意params[:product]。它基本上是在说“发出一个帖子请求products#update并将其传递@update:product.

这就解释了符号部分。测试中的:product符号是更新操作所期望的包含产品数据的参数名称。

post :update, :product => @update

从理论上讲,您可以随心所欲地称呼它。但按照惯例,将其称为资源名称会有所帮助。

于 2013-07-16T02:53:15.960 回答