2013-06-15 2 views
0

Итак, я действительно новичок в Ruby on Rails, и все это по-прежнему звучит как китайский для меня. Извините, если это глупый вопрос, но я пытаюсь создать новую кнопку в своем приложении, которая позволяет мне копировать вещи.Почему мои параметры не попадают в 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 не кажется, чтобы прошло к copy функции в items_controller.rb, поэтому каждый раз, когда я нажимаю кнопку копирования, я получаю ошибку:

undefined method property_values' для ноль: NilClass`

для линии:

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

Что я делаю не так? Почему не прошло item?

+0

Вы должны подумайте о принятии ответов, которые разрешают вопросы, которые вы опубликовали. – zeantsoi

ответ

0

@item - это переменная экземпляра, и ее значение равно nil, если вы не установили иное. Это то, что у нас есть - вы не устанавливаете @item в любом месте этого действия, поэтому это nil. Вы, вероятно, следует (если у вас есть соответствующие Item модели) типа:

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

, прежде чем вы хотели бы использовать @item значение.

0

Во-первых, вам необходимо изменить свой вид формы, чтобы передать Item идентификатор, который вы можете использовать, чтобы найти соответствующий объект модели в контроллере:

%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 

Затем в контроллере, вы можете посмотреть свой Item по ID:

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

Вы нашли решение этой проблемы? – zeantsoi

Смежные вопросы