所以,我是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
没有通过?
答案 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