2013-06-11 2 views
0

Я работаю над своим первым проектом рельсов, и у меня есть проблема, которую я просто не могу понять.Метод Доступность/Область действия - NoMethodError

Я создал помост для объекта с именем Архива

к этому объекту Я добавил метод ProcessFile

при попытке link_to указанного способ из архивов # Индекса Я получаю это:

undefined method `processfile' for #<Archive:0x702de78> 

Это модель archive.rb

class Archive < ActiveRecord::Base 
belongs_to :users 
attr_accessible :file, :user_id 
mount_uploader :file, FileUploader 
end 

Это код на index.html.erb (принадлежащих к архивам)

<% @archives.each do |archive| %> 
<tr> 
<td><%= archive.file%></td> 
<td><%= User.find(archive.user_id).name %></td> 
<td> 
    <%= link_to 'Download', archive.file_url %> 
    :: 
    <%= link_to 'Show', archive %> 
    :: 
    <%= link_to 'Edit', edit_archive_path(archive) %> 
    :: 
    <%= link_to 'Delete', archive, confirm: 'Esta Seguro?', method: :delete %> 
    :: 
    <%= link_to "Process", archive.processfile %> 


</td> 
</tr> 
<% end %> 

Это routes.rb линия:

match "archives/processfile/:id" => "archives#processfile", :as => :processfile 

ProcessFile метод, определенный whitin archives_controller.rb ничего не имеет, я просто хотел проверить функционал у, так как я с трудом получаю сцепление «рельсы пути»

archives_controler.rb

def processfile 
# @archive = Archive.find(params[:id]) 
#do something with the archive 
end 

В общем, что я в конечном счете хочу добиться того, чтобы позвонить в ProcessFile по заданному архиву (взято из индексной таблицы), чтобы что-то сделать с ним. В этом примере я опустил вызов метода (не передавая ему архив или файл archive.file), чтобы запустить его, но безрезультатно.

Я много искал (на Google и здесь) и не нашел четкого руководства, которое могло бы решить мою проблему, вероятно, потому что я новичок и не могу полностью понять концепции, лежащие за рельсами MVC.

Я читал кое-что о методах, к которым обращаются только те же самые контроллеры, но я видел пример кода, когда люди вызывают методы на контроллерах из представлений индексов, не объявляя их как помощники. o.0

Я знаю, что это, вероятно, глупая путаница, но я не могу понять :(

ответ

1

Способ, которым вы структурировали свой маршрут (т. Е. match "archives/processfile/:id" => "archives#processfile"), означает, что он ожидает передачи архива id.Вам нужно настроить ваш link_to разъехаться:

# app/archives/index.html.erb 
<%= link_to "Process", processfile_path(archive.id) %> 

ошибки вы получаете, потому что вы пытаетесь вызвать метод экземпляра под названием processfile на archive, но нет никакого способа, предположительно под этим именем. Второй параметр помощника link_to - это путь, а не метод экземпляра.

EDIT:

Если вы хотите, чтобы ваши маршруты более RESTful (который вы должны делать, если вы создали Archive ресурса), вы можете создать все CR маршруты, объявив resource :archives в вашем маршруты. Затем в блоке вы можете объявить блок участником маршрутов, все из которых направятся к указанному действию в вашем archive_controller.rbи позволяют передавать архив id в действие.

# config/routes.rb 
resources :archives do 
    member do 
     get 'processfile' 
    end 
end 
+1

Это действительно вызовет исключение. Вам нужно изменить 'archive_processfile_path' на' processfile_path' уведомление, что у него есть 'as: processfile'. Значение маршрута не основано на имени ресурса. –

+0

Хороший улов - я думал, что плакат использовал RESTful routing. Путь должен действительно быть «processfile_path», как указывает указанный маршрут. Обновлено, чтобы отразить. – zeantsoi

+0

Это на самом деле моя ошибка при размещении вопроса, изначально метод и вызов link_to использовали archive.id, но я испортил его, пытаясь заставить его работать без него, я в конечном итоге испортил мой код, отображающий этот вопрос. coul Вы показываете мне, какой был бы RESTful способ достичь того, что я пытаюсь сделать? –

1

Вы добавили метод processfile к вашим ArchiveController. Это не делает метод доступным для Archive модели. Если вы хотите, чтобы метод был доступен для экземпляров Archive моделей, то вам необходимо поместить его в модели как метод экземпляра.

Если то, что вы хотите сделать, это разместить маршрут к действию processfile в вашем ArchiveController то вы можете сделать это, добавив link_to "Process", processfile_path(id: archive.id)

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