0

我正在做我的第一个 Rails 项目,但我遇到了一个我无法弄清楚的问题。

我为一个名为 Archive的对象生成了一个 Scaffold

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

当我尝试从 Archives#Index 链接到所说的方法时,我得到了这个:

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

这是模型 存档.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

定义 whitin archives_controller.rb的 processfile 方法没有任何内容,我只是想测试功能,因为我很难掌握“rails 方式”

archives_controler.rb

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

总而言之,我最终想要实现的是在给定存档(取自索引表)上调用processfile方法 来处理它。在示例中,我淡化了方法调用(不向其传递档案或 archive.file)以使其运行,但无济于事。

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

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

我知道这可能是一个愚蠢的混淆,但我无法弄清楚:(

4

2 回答 2

1

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

如果您想要做的是processfile在您的操作中放置一条路线,ArchiveController那么您可以通过添加link_to "Process", processfile_path(id: archive.id)

于 2013-06-11T01:21:06.387 回答
1

您构建路线的方式(即,match "archives/processfile/:id" => "archives#processfile")意味着它期望通过存档id。你需要调整你link_to的通过一个:

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

您收到的错误是因为您试图调用一个名为processfileon的实例方法archive,但可能没有该名称的方法。助手的第二个参数link_to是路径,而不是实例方法。

编辑:

如果你想让你的路由更加 RESTful(如果你已经创建了资源,你应该Archive这样做),你可以通过在你的路由中声明来生成所有的 CRUDresource :archives路由。然后,在一个块中,您可以声明一个成员路由块,所有这些都将路由到您的指定操作,archive_controller.rb 并使您能够将存档传递id给操作。

# config/routes.rb
resources :archives do
    member do
        get 'processfile'
    end
end
于 2013-06-11T01:21:11.153 回答