我正在开发我的第一个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
我知道这可能是一种愚蠢的混乱,但我无法弄明白:(
答案 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