0

所以,我对 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似乎没有传递给copyitems_controller.rb 中的函数,所以每次单击复制按钮时,都会出现错误:

undefined methodnil 的 property_values':NilClass`

对于该行:

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

我究竟做错了什么?为什么不item通过?

4

2 回答 2

0

@itemnil是一个实例变量,除非您另外设置,否则它的值是。这就是我们在这里所拥有的——你没有@item在这个动作中设置任何地方,这就是为什么它是nil. 您可能应该(假设您有相应的Item模型)类型:

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

在你想@item使用价值之前。

于 2013-06-15T21:17:28.387 回答
0

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

%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
于 2013-06-15T21:18:21.847 回答