方法可访问性/范围 - NoMethodError

时间:2013-06-11 01:14:41

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

我正在开发我的第一个rails项目,我遇到了一个我无法弄清楚的问题。

我为名为存档

的对象生成了一个脚手架

到这个对象我添加了方法 processfile

当我尝试link_to来自Archives#Index的方法时,我得到了这个:

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 上没有任何内容,我只想测试功能,因为我很难掌握“rails way”

archives_controler.rb

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

总而言之,我最终想要实现的是在给定的存档(取自索引表)中调用 processfile 方法来对其执行某些操作。在这个例子中,我淡化了方法调用(没有将archive或archive.file传递给它)以使其运行,但无济于事。

我搜索了很多(在谷歌和这里),并没有找到一个明确的指南,可以解决我的问题,可能是因为我是新的,无法完全掌握rails MVC背后的概念。

我已经阅读了一些只有被同一个控制器访问的方法,但是当人们从索引视图调用控制器上的方法而不将它们声明为帮助程序时,我看到了示例代码。 o.0

我知道这可能是一种愚蠢的混乱,但我无法弄明白:(

2 个答案:

答案 0 :(得分:1)

您已将processfile方法添加到ArchiveController。这不会使Archive模型的方法可用。如果您希望该方法可用于Archive模型的实例,则需要将其作为实例方法放在模型中。

如果您要执行的操作是为processfile中的操作ArchiveController设置路线,则可以添加link_to "Process", processfile_path(id: archive.id)

答案 1 :(得分: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助手的第二个参数是路径,而不是实例方法。

编辑:

如果您希望使路线更加RESTful(如果您创建了Archive资源,应该那么做),您可以通过声明{来生成所有CRUD路线{1}}在您的路线中。然后,在一个区块内,您可以声明一个成员路由块,所有路由都将路由到resource :archives 中的指定操作,使您能够通过该行动的归档archive_controller.rb

id