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

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

ただいまの
回答率

90.62%

  • Ruby

    7302questions

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

  • Ruby on Rails

    6966questions

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

写真が投稿できない(carrierwave、RMagick使用)

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 133

Manamin

score 4

ユーザー投稿系のsnsを制作しています。
以前は画像を投稿できたものの。ユーザーと紐付けた後投稿できなくなりました。
createアクションのsave前でbinding.pryしたところ、imageに値が入っていませんでした。
参考にした記事では今のままのコードで表示されてるのでどこがおかしいかわかりません。
よろしくお願いします

Already linked: /usr/local/Cellar/imagemagick@6/6.9.9-42
と表示されるのでimagemagickは6系でrmagickは確認したところ2.16.0です。

なおパラメーターにはimageが渡ってきているものの、createアクション時のPost.newにはデータを渡せてないようです。

イメージ説明

<%= form_for(@post, :html => {:multipart => true}) do |f| %>
を記述した後のパラメーターやコンソール

:multipart => trueの指定が反映されず
イメージ説明

イメージ説明

読んだ記事
https://qiita.com/ttaka66/items/264dcb85e41f9135685c
http://igarashikuniaki.net/rails_textbook/picture-upload.html

フォームのフロント部分

<%= form_with(model: post, local: true) do |form| %>
  <% if post.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(post.errors.count, "error") %> prohibited this post from being saved:</h2>

      <ul>
      <% post.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

<div class="form">
    <table>
            <tbody>
                <%= form_for(@post, html: { multipart: true }) do |f| %> // ここ
                    <div class="field">
                        <tr>
                            <th><%= f.label :TOP画像 %></th>
                            <td><%= f.file_field :image %></td> //画像投稿フォーム
                        </tr>    
                    </div>

                <tr>
                    <div class="field">
                        <th><%= f.label :サービス名 %></th>
                        <td><%= f.text_field :name, id: :post_name %></td>
                    </div>
                </tr>

                <tr>
                    <div class="field">
                        <th><%= f.label :どんなサービス? %></th>
                        <td><%= f.text_area :body, id: :post_body %></td>
                    </div>
                </tr>

                <tr>
                    <div class="field">
                        <th><%= f.label :どんな技術が使われている? %></th>
                        <td><%= f.text_area :tec, size: "20×10", id: :post_tec %></td>
                    </div>
                </tr>

                <tr>
                    <div class="field">
                        <th><%= f.label :どこがオススメ? %></th>
                        <td><%= f.text_area :point, id: :post_point %></td>
                    </div>
                </tr>

                <tr>
                    <div class="field">
                        <th><%= f.label :LINK %></th>
                        <td><%= f.text_area :link, id: :post_link %></td>
                    </div>
                </tr>    

                <tr>
                    <div class="actions">
                        <th></th>
                        <td><%= form.submit %></td>
                    </div>
                </tr>
            <% end %>
        </tbody>
    </table>                
<% end %>
<p id="notice"><%= notice %></p>

<p  class="name">
  <strong></strong>
  <a><%= @post.name %></a>
</p>

<div class="image_body">
    <p class="image">
        <strong></strong>
        <%= image_tag @post.image_url.to_s, :size => "300x200" %> //画像表示
    </p>    
    <p class="body">
        <strong></strong>
        <%= @post.body %>
    </p>
    <p>
        <strong>id:</strong>
        <%= @post.user_id %>
    </p>
</div>

<div class="tec_point_link">
    <p>
        <strong>Tec:</strong>
        <%= @post.tec %>
    </p>

    <p>
        <strong>Point:</strong>
        <%= @post.point %>
    </p>

    <p>
        <strong>Link:</strong>
        <%= @post.link %>
    </p>
</div>

<%= link_to 'Edit', edit_post_path(@post) %> |
<%= link_to 'Back', posts_path %>
class Post < ApplicationRecord
  mount_uploader :image, ImageUploader //関連付け
  belongs_to :user, optional: true
end
class ImageUploader < CarrierWave::Uploader::Base

  # Include RMagick or MiniMagick support:
  include CarrierWave::RMagick
  # include CarrierWave::MiniMagick

  # Choose what kind of storage to use for this uploader:
  storage :file

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # Provide a default URL as a default if there hasn't been a file uploaded:
  # def default_url
  #   # For Rails 3.1+ asset pipeline compatibility:
  #   # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
  #
  #   "/images/fallback/" + [version_name, "default.png"].compact.join('_')
  # end

  # Process files as they are uploaded:
  # process scale: [200, 300]
  #
  # def scale(width, height)
  #   # do something
  # end

  # Create different versions of your uploaded files:
  # version :thumb do
  #   process resize_to_fit: [50, 50]
  # end

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  # def extension_whitelist
  #   %w(jpg jpeg gif png)
  # end

  # Override the filename of the uploaded files:
  # Avoid using model.id or version_name here, see uploader/store.rb for details.
  # def filename
  #   "something.jpg" if original_filename
  # end

end
ActiveRecord::Schema.define(version: 20180711174827) do

  create_table "posts", force: :cascade do |t|
    t.string "name"
    t.text "body"
    t.text "tec"
    t.text "point"
    t.text "link"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "image" //ここ
    t.integer "user_id"
  end

  create_table "users", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "provider"
    t.string "nickname"
    t.string "image_url"
  end

end
class PostsController < ApplicationController
  before_action :set_post, only: [:show, :edit, :update, :destroy]
  before_action :current_user

  # GET /posts
  # GET /posts.json
  def index
    @posts = Post.all
  end

  # GET /posts/1
  # GET /posts/1.json
  def show
  end

  # GET /posts/new
  def new
    @post = Post.new
  end

  # GET /posts/1/edit
  def edit
  end

  # POST /posts
  # POST /posts.json
  def create
    @post = Post.new(post_params)
    @post.user_id = @current_user.id

    binding.pry

    respond_to do |format|
      if @post.save
        format.html { redirect_to @post, notice: 'Post was successfully created.' }
        format.json { render :show, status: :created, location: @post }
      else
        format.html { render :new }
        format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /posts/1
  # PATCH/PUT /posts/1.json
  def update
    respond_to do |format|
      if @post.update(post_params)
        format.html { redirect_to @post, notice: 'Post was successfully updated.' }
        format.json { render :show, status: :ok, location: @post }
      else
        format.html { render :edit }
        format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /posts/1
  # DELETE /posts/1.json
  def destroy
    @post.destroy
    respond_to do |format|
      format.html { redirect_to posts_url, notice: 'Post was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_post
      @post = Post.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def post_params
      params.require(:post).permit(:name, :user_id, :image, :body, :tec, :point, :link)
    end

    def current_user
      @current_user = User.find_by(id: session[:user_id])
    end
end
# Image Uploader
gem 'carrierwave'
gem 'rmagick', require: 'RMagick'
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

画像をvaridateしてないのではないでしょうか。
varidateしてないと、エラー吐かないでnullのままレコード登録する挙動だった気がします。
サイズと拡張子のvaridateを追記してみてください

だめそうなら、varidateはなくして、:multipart => trueをフォームに追記してみてください

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/01 16:18 編集

    回答ありがとうございます。postモデルにバリデーションを追加してみたのですがダメでした。:multipart => trueも追加したのですがかわらず表示されません。MiniMagickに変えても表示されません。

    キャンセル

  • 2018/08/01 16:52

    ごめんなさい、見落としがありました

    "image"=> "スクリーンショット 2018-07-12 午前6.27.49.png"
    ですが、ここからparamaterに画像の名前しか渡ってきていないとわかります。中身のデータがないので、ビュー側でちゃんと送れていないかと思います。
    なので、ビューのformタグ内に、:multipart => trueを指定してあげてください。
    これでビューにenctype="multipart/form-data"が入って無事パラメータに画像データを格納できるはずです。



    ここまでやったら一度、画像ファイル送信して、binding.pryでparamaterの中身を確認してみてください。
    paramaterにまだファイル名しか入っていなければその旨追記お願いします。
    paramaterに画像ファイルが格納できていたら、image =>#<ActionDispatch::Http**UploadedFile:>から始まる情報が返ってくると思います。ファイルが入っている状況でレコードをnewするところまで進めて、変数X=モデル名.new(すとろんぐぱらめーた)で変数に入れておいてください。binding.pryしておいて、変数Xを出力したとき、imageにちゃんとデータが入ってるか確認してください。

    いったんここまでで

    キャンセル

  • 2018/08/01 18:39

    ありがとうございます。viewに <%= form_for(@post, html: { multipart: true }) do |f| %>とたしかに記載しているのですが、それでも格納できません。

    キャンセル

  • 2018/08/01 21:05

    フォームが二ヶ所に分かれていたのですが<%= form_with(model: post, local: true) do |form| %>に入れたら表示できました!ありがとうございました!

    キャンセル

0

controllerのstrong parameter部分でimageをpermitしていないのではないかと思います

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/12 09:02

    コントローラーも追記したのですが、privateメソッドでpermitしております

    キャンセル

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7302questions

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

  • Ruby on Rails

    6966questions

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