0

私は最初の Rails プロジェクトに取り組んでいますが、理解できない問題があります。

Archiveという名前のオブジェクトの Scaffold を生成しました

このオブジェクトにメソッド processfileを追加しました

Archives#Index から前述のメソッドを link_to しようとすると、次のようになります。

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

archives_controller.rbで定義された processfile メソッドには何もありません。「レールの方法」を理解するのに苦労しているので、機能をテストしたかっただけです。

archives_controler.rb

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

全体として、私が最終的に達成したいことは、特定のアーカイブ(インデックス テーブルから取得) に対してprocessfileメソッド を呼び出して、それを処理することです。この例では、メソッド呼び出しを (archive または archive.file を渡さずに) 骨抜きにして実行しましたが、役に立ちませんでした。

私は(Googleとここで)たくさん検索しましたが、おそらく私が新しく、Rails MVCの背後にある概念を完全に理解できないため、私の問題に対処する明確なガイドが見つかりませんでした.

同じコントローラーによってのみアクセスされるメソッドについて何か読んだことがありますが、ヘルパーとして宣言せずにインデックス ビューからコントローラーのメソッドを呼び出すときのサンプル コードを見てきました。o.0

おそらくばかげた混乱であることはわかっていますが、理解できません:(

4

2 に答える 2

1

processfileメソッドを に追加しましたArchiveControllerArchiveこれでは、メソッドがモデルで使用できるようになりません。メソッドをモデルのインスタンスで使用できるようにする場合はArchive、インスタンス メソッドとしてモデル内に配置する必要があります。

あなたがやりたいことがアクションへのルートを配置することである場合は、追加することでそれを行うことができprocessfileますArchiveControllerlink_to "Process", processfile_path(id: archive.id)

于 2013-06-11T01:21:06.387 に答える
1

ルートを構成した方法 (つまり) は、アーカイブが渡されることをmatch "archives/processfile/:id" => "archives#processfile"期待していることを意味します。1つを渡すidように調整する必要があります:link_to

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

processfile受け取ったエラーは、 onというインスタンス メソッドを呼び出そうとしているためですがarchive、おそらくその名前のメソッドはありません。link_toヘルパーの 2 番目のパラメーターはパスであり、インスタンス メソッドではありません。

編集:

ルートをより RESTful にすることを検討している場合 (リソースを作成した場合Archiveそうする必要があります)、ルートで宣言することによってすべての CRUD ルートを生成できますresource :archives次に、ブロック内でメンバールートのブロックを宣言できます。これらはすべて、指定されたアクションにルーティングされ、アクションにアーカイブarchive_controller.rb 渡すことができますid

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