質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Router

Routerは、異なるネットワーク同士を相互に接続するための通信機器。インターネットでのデータを自動的に振り分け、一つのインターネット回線を複数のコンピュータで使用することが可能です。DHCPによりIPアドレスを自動的に割振りすることもできます。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

1回答

1245閲覧

railsでアップロードしたファイルをダウンロードする機能を作りたいです。

T-Kenty

総合スコア12

Router

Routerは、異なるネットワーク同士を相互に接続するための通信機器。インターネットでのデータを自動的に振り分け、一つのインターネット回線を複数のコンピュータで使用することが可能です。DHCPによりIPアドレスを自動的に割振りすることもできます。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2019/07/23 12:47

前提・実現したいこと

railsを使ってマシンからブラウザにアップロードしたファイルをDBに保存して、
保存したファイルをダウンロードするウェブアプリを作りたいです。

発生している問題・エラーメッセージ

自作アプリを保存するウェブアプリを作成しています。名前や作者名、ファイルの概要を入力し、ファイルデータをbinaryで保存した後、そのファイルをダウンロードしたいのですが、route.rbの記述がいまいちわかりません。。。
今作成中のウェブアプリの概要として
1・index.html.erbから「新規作成」リンクをクリックしてnew.html.erbに移動
2・new.html.erbアクションで項目の入力とファイルをアップロードをし、公開ボタンを押す
3・index.html.erbで公開されているファイルの名前と作者名を表示
4・「内容を表示」リンクをクリックしてshow.html.erbに移動
5・show.html.erbで「ダウンロード」ボタンを押す
6・該当のファイルをダウンロードする←いまここで詰まってます。

該当のソースコード

route.rbの概要ソースコードです。
GETとPOSTの使い方がわかりません。
Rails.application.routes.draw do
resources :applodes
root 'applodes#index'
resources :show
root 'applodes#show'
get 'applodes/:id/show' , to:'applodes#show'
delete '/', to:'applodes#show'
get 'applodes/:id/show', to: 'applodes#get_file'
post 'applodes/:id/show',to: 'applodes#get_file'

applodesコントローラのget_fileアクションです。
ダウンロードボタンが押された際にこのアクションを起動するように設定したいです。
def get_file
file = App.find(params[:id])
send_data file.data, disposition: :inline, type:'file/zip'
end

show.html.erbのソースコードです。
一番下のダウンロードボタンのパスですが、ダウンロードした後は今のページにとどまるようにしたいです。

<p> <strong>タイトル:</strong> <%= @applode.title %><br> <strong>作者名:</strong> <%= @applode.name %><br> <strong>アプリの内容:</strong> <%= @applode.content %> </p> <%= link_to '戻る','/' %> <%= button_to 'download','/' %> ### 試したこと

ここに問題に対して試したことを記載してください。
route,rbのpostを以下のようにしても、idが見つからない旨のエラーが出てしまいました。
post '/',to: 'applodes#get_file'

エラー内容
Couldn't find App with 'id'=:id

def get_file
file = App.find(params[:id])
send_data file.data, disposition: :inline, type:'file/zip'
end
end

補足情報(FW/ツールのバージョンなど

rails ver5.2.3
ruby 2.6.3p62
cloud9での開発をしています。railsを学習し始めて3か月程度の未熟者です。。。
できればrouteの書き方を特に教えていただけると嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

<%= button_to 'download','/' %>

このボタンを押したときのアクションを用意したものに修正すればよさそうですね。
この状態では、ルートパスに対してPOSTのリクエストが走ります。
やりたいことは、

  • applodes コントローラーの
  • get_file アクションに対して
  • idのパラメータを載せて
  • get リクエストする

だと思うので、
https://stackoverrun.com/ja/q/3314065
の回答にあるようにcontroller、action、id: @applode.idを指定してあげてはどうでしょうか?


ちなみにですが、以下のURLで定義されいているルーティングを確認することができます。
http://あなたのホスト/rails/info/routes

Railsのデフォルトだと http://localhost:3000/rails/info/routes ですね。
ここを見ていただくと、applodesに関するルーティングの一覧が出ているはずです。

また、この部分は同じURLに対して2つのアクションが紐付いているため先に書いたほうが優先されます。

ruby

1get 'applodes/:id/show' , to:'applodes#show' 2get 'applodes/:id/show', to: 'applodes#get_file'

見た感じ、resources :applodes だけで足りそうな気はします。
resourcesを指定したときのルーティングは
https://qiita.com/Atsushi_/items/bb22ce67d14ba1abafc5
を参照して勉強してみてください。

投稿2019/07/23 15:18

編集2019/07/23 15:24
8zca

総合スコア559

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問