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

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

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

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

Q&A

解決済

1回答

854閲覧

Ruby on rails6でcarrierwaveを使った写真のアップローダに関して

Azuma111

総合スコア6

Ruby on Rails 6

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

0グッド

0クリップ

投稿2020/02/24 06:53

Ruby on rails6でcarrierwaveを使った写真のアップローダしたいのですが
undefined method `reports_path'というエラーでできません。

以下、行った操作です。
1.アップローダ生成
rails generate migration add_image_to_reports image:string
rails db:migrate

2.モデルファイルのマウント
Post.rb
class Post < ApplicationRecord
mount_uploader :image, ImageUploader
end

3.下記URLを参考に以下を追加(目的は理解できてないです。)
http://watarisein.hatenablog.com/entry/2015/10/16/011240
home_controller.rb
private
def report_params
params.require(:report).permit(:name, :image)
end

3.アップロードフォームの作成
ですが、以下の1行目でundefined method `reports_path'となります。
new.html.erb
<%= form_for @report do |f| %>
<%= f.file_field :image %>
<%= f.submit 'アップロードする'%>
<% end %></td></tr>

自身で理解が十分ではなく説明が不十分かとは思いますが、
教えていただければと思います。
よろしくお願いいたします。

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

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

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

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

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

maisumakun

2020/02/24 06:55

ルーティングはどのようになっていますか?
Azuma111

2020/02/24 06:57

ルーティングは get 'posts/new' => 'posts#new' コントローラは def new end となっています。
maisumakun

2020/02/24 07:13

@reportはどんな変数でしょうか?
Azuma111

2020/02/24 07:24

早速のご返答ありがとうございます。 回答になっているかわかりませんが、reportはDBで定義しているdatetime, text等のtableの変数です。
maisumakun

2020/02/24 07:26

Reportモデルとreportsテーブルがある、ということで間違いないですか?
Azuma111

2020/02/24 07:44 編集

ご指摘が私が初心者ゆえ、理解できない部分がありますが、 再度、以下のURLを確認したところアップローダの生成でadd_image_to_reportとすべきところをadd_image_to_reportsとしていました。 http://watarisein.hatenablog.com/entry/2015/10/16/011240 再度、以下を実行したところ、 rails generate migration add_image_to_report image:string rails db:migrate 以下のエラーがでました。 rake db:migrate:status == 20200224073736 AddImageToReport: migrating ================================= -- add_column(:reports, :image, :string) rake aborted! StandardError: An error has occurred, this and all later migrations canceled: SQLite3::SQLException: duplicate column name: image C:/Users/hogehoge/20200224073736_add_image_to_report.rb:3:in `change' Caused by: ActiveRecord::StatementInvalid: SQLite3::SQLException: duplicate column name: image C:/hogehoge/20200224073736_add_image_to_report.rb:3:in `change' Caused by: SQLite3::SQLException: duplicate column name: image C:/hogehoge/db/migrate/20200224073736_add_image_to_report.rb:3:in `change' Tasks: TOP => db:migrate (See full trace by running task with --trace)
maisumakun

2020/02/24 07:44

> アップローダの生成でadd_image_to_reportとすべきところをadd_image_to_reportsとしていました。 マイグレーションの名前は再利用しませんので、(他と衝突しない限り)間違えても問題ありません。 > ご指摘が私が初心者ゆえ、理解できない部分がありますが、 では、@reportへの代入文がどのようになっているかコードで示してください。
Azuma111

2020/03/22 00:59

返信が遅くなってしまいすみません。 その後、自身でもいろいろいじってみたのですが、まだ解決せず、教えていただきたく思います。 new.html.erb <%= form_with url: '/posts/create', method: :get, local: true do |f| %> <%= f.label :image, "画像" %> <%= f.file_field :image %> <textarea name="comment"></textarea> <%= f.submit 'アップロードする'%> <% end %> reports_controller.rb def create @report = Report.new(report_params) @report.comment = params[:comment] @report.image = params[:image] if @report.save redirect_to("/posts/report") end end private def report_params #params.require(:post).permit(:name, :image) params.require(report).permit(:comment, :image) end git bashで以下が表示されていて、imageの中身がnilとなっているので、うまくcreateの中に値を渡せていないのだと解釈していますが、どのようにすればよいのか分からずご教授お願い致します。 Report Create (1.7ms) INSERT INTO "reports" ("comment", "created_at", "updated_at", "image") VALUES (?, ?, ?, ?) [["comment", "test"], ["created_at", "2020-03-22 00:55:06.900564"], ["updated_at", "2020-03-22 00:55:06.900564"], ["image", nil]]
guest

回答1

0

ベストアンサー

うまくcreateの中に値を渡せていないのだと解釈していますが、どのようにすればよいのか分からずご教授お願い致します。

値は渡せていますが、あとから@report.image = params[:image]消してしまっています

ruby

1# reports_controller.rb 2 3def create 4 @report = Report.new(report_params) 5 if @report.save 6 redirect_to("/posts/report") 7 end 8end 9 10def report_params 11 # コロンが抜けていた 12 params.require(:report).permit(:comment, :image) 13end 14

これだけで大丈夫かと思います。

投稿2020/03/22 01:04

maisumakun

総合スコア145184

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

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

Azuma111

2020/03/22 01:25

ご指摘の通り、コロンが抜けていました。 1.@report.image = params[:image]の削除 2.コロンの追加 def create @report = Report.new(report_params) if @report.save redirect_to("/posts/report") end end private def report_params params.require(:report).permit(:comment, :image) end 以上の対応をしましたが、やはりimageがnilとgit bashに表示されます。ご指摘の通り、parameterを渡すところまではできていて、transactionの開始時に消えてしまっているようです。 Processing by PostsController#create as HTML Parameters: {"image"=>"DSCF0744.JPG", "comment"=>"test2", "commit"=>"アップロードする", "id"=>"create"} (0.1ms) begin transaction ↳ app/controllers/posts_controller.rb:25:in `create' Report Create (1.9ms) INSERT INTO "reports" ("comment", "created_at", "updated_at", "image") VALUES (?, ?, ?, ?) [["comment", "test2"], ["created_at", "2020-03-22 01:23:29.999569"], ["updated_at", "2020-03-22 01:23:29.999569"], ["image", nil]]
maisumakun

2020/03/22 01:38

あと、フォームのmethodをpostに切り替える、そしてenctype="multipart/form-data"を指定することをしないと、そもそもブラウザからファイルデータが送られません。
Azuma111

2020/03/22 01:51

methodをpostにすることでアップロードできました。 自力でなかなか解決できなかったので助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問