为什么我的参数不能在Ruby on Rails中传递?

时间:2013-06-15 21:08:58

标签: ruby-on-rails ruby-on-rails-3.2

所以,我是Ruby on Rails的新手,整个事情对我来说仍然像中文。对不起,如果这是一个愚蠢的问题,但我正试图在我的应用程序上创建一个新按钮,让我复制东西。

在我的表格上我有:

%span.btn.btn-mini.btn-inverse= link_to copy_image, copy_campaign_signal_processor_item_path(@campaign, @processor, item) ,data: { toggle:"modal",target: "#myModal"}, remote: true

工作正常并为我创建按钮。然后,在routes.rb中,我有:

resources :signal_processors, exclude: [:index, :new, :create], controller: 'processors' do

        member do
          get :modify, :action => :edit, :force_schema_update => true
        end

        resources :items do
          member do
            get :copy
          end
        end

最后,在items_controller.rb中,我有:

  def copy
    @overlay_title = "Copy #{@processor.item_name}"
    @processor.properties.each do |property|
      unless @item.property_values.collect{|a| a.property_id}.index(property.id)
        @item.property_values << SignalProcessor::PropertyValue.new(property: property)
      end
    end

    respond_to do |format|
      format.js
    end
  end

问题在于,由于某种原因item似乎没有传递给items_controller.rb中的copy函数,所以每次单击复制按钮时,都会收到错误:< / p>

undefined method property_values'代表nil:NilClass`

为该行:

unless @item.property_values.collect{|a| a.property_id}.index(property.id)

我做错了什么?为什么item没有通过?

2 个答案:

答案 0 :(得分:0)

@item是一个实例变量,除非另行设置,否则其值为nil。这就是我们在这里所做的 - 你没有在这个动作的任何地方设置@item,这就是nil的原因。您应该(假设您有相应的Item模型)类型:

@item = Item.find(params[:id])

在您想要使用@item值之前。

答案 1 :(得分:0)

首先,您需要修改表单视图以传递Item id,您可以使用该ID在控制器中查找相应的模型对象:

%span.btn.btn-mini.btn-inverse= link_to copy_image, copy_campaign_signal_processor_item_path(@campaign, @processor, item.id) ,data: { toggle:"modal",target: "#myModal"}, remote: true

在你的表单中,你将三个参数传递给你的路径,但你还没有在你的路线中命名它们。您可以将要传递的参数命名为copy资源块中的:items路径:

resources :items do
    member do
        get 'copy/:campaign/:processor/:item_id', :action => 'copy'
    end
end

然后,在您的控制器中,您可以按ID:

查找Item
def copy
   @item = Item.find(params[:item_id])
   ...
end