7

私は、ユーザーが簡単なフォームを介して、さらにFTPを使用して特定のディレクトリにビデオをアップロードし、フォームを介してアップロードする代わりにFTPディレクトリからファイルを選択できるプロジェクトに取り組んでいます。

私は次の、かなり標準的なセットアップを取得しましたvideos_controller

# routes.rb
resources :videos

# new.html.rb
form_for(@video) do |f|
  ...
end

コントローラの安らかなアクションはすべて機能しており、標準的な動作です。アップロードは機能しますが、それは問題ではありません。問題は、私が次のことをした場合です。

# routes.rb
resources :videos do
  member do
    post :from_ftp
  end
end

# new.html.rb
form_for(@video, :url => from_ftp_video_url) do |f|
  ...
end

No route matches {:action=>"from_ftp", :controller=>"videos"}生成されたルートは次のようになっているため、次のエラーが発生します。

from_ftp_video POST   /videos/:id/from_ftp(.:format)        videos#from_ftp

メンバールートなので、これは正しいようです。ただし、フォームではなく、FTPディレクトリのファイルを使用して新しいVideoオブジェクトを作成しているため、URLの一部は必要ありません:id...したがって、これは基本的に別のcreateアクションであるため、 POSTリクエストとしてそれを行うのが好きです...

では、どうすればこれに最善の方法で取り組むことができますか?

4

2 に答える 2

17

選択した回答はVapireの状況に対して正しいものですが、必ずしもタイトルの質問に回答するわけではありません。IDが不要なため、IDなしでメンバーのアクションを取得する方法を探してここに来た場合、答えは少し異なります。

を設定する認証を実装したとしますcurrent_user。ユーザーが自分のプロファイルのみを編集できるようにします。その場合users/:id/edit、:idはcurrent_userメソッドによって指定されるため、意味がありません。この場合/users/edit、より理にかなっています。

ルートにIDを指定せずにメンバーアクションを作成するようにroutes.rbファイルを変更できます。

...これの代わりに...

resources :user

...これを使用します(複数のリソースに注意してください)...

resource :user
于 2014-05-14T19:39:55.053 に答える
13

メンバーとコレクションのルートを理解する方法は次のとおりです。

  • メンバールートは、あなたが持っているオブジェクトに対して何かをします。
  • コレクションルートは、すべてのオブジェクトのセットに対して何かを行います。

createしたがって、ルートがどうなるかを考えると、コレクションに新しいオブジェクトが追加されるため、コレクションルートになります。

したがって、from_ftpメソッドはコレクションに追加されるため、コレクションルートでもある必要があります。

createまた、既存の方法でFTP機能に対応できるかどうかを検討することをお勧めします。

于 2013-03-15T16:43:45.323 に答える