form_forで作成したfile_field(画像用)とtext_area(content用)に内容を入力して保存したのですが、保存されていないのか画像とtext_areaに入力した内容が描画されず空の投稿と削除のリンクのみ描画されてしまいます。
デベロッパーツールで確認してもcontentの中身は空で、画像の方は後置ifで画像データが無い場合は描画されないようにしているのでそちらは描画自体されていません。
画像投稿用のcreateアクションが入っているcontroller
画像投稿用のcreate class PhotopostsController < ApplicationController before_action :authenticate_user!, only: [:create, :destroy] before_action :correct_user, only: :destroy def create @photopost = current_user.photoposts.build(photopost_params) if @photopost.save flash[:success] = "画像が投稿できました!" redirect_to mypage_url(current_user) else end end def destroy @photopost.destroy flash[:success] = "投稿を削除しました" redirect_to request.referrer || root_url end private def photopost_params params.require(:photopost).permit(:content, :picture) end def correct_user @photopost = current_user.photoposts.find_by(id: params[:id]) redirect_to root_url if @photopost.nil? end end
画像投稿用のパーシャル
<%= form_for(@photopost) do |f| %> <span class="picture"> <%= f.file_field :picture %> </span> <div class="field"> <%= f.text_area :content, placeholder: "コメントの追加" %> </div> <%= f.submit "投稿", class: "btn btn-success" %> <% end %>
保存された画像とcontentを描画するパーシャル
<li id="photopost-<%= @photopost.id %>"> <%= link_to gravatar_for(@photopost.user, size: 50) %> <span class="user"><%= link_to @photopost.user.name, photopost_path %></span> <span class="content"> <%= image_tag @photopost.picture.url if @photopost.picture? %> <%= @photopost.content %> </span> <span class="timestamp"> <%= link_to "削除", photopost, method: :delete, data: { confirm: "You sure?" } %> </span> </li>
描画するviewを呼ぶcontrollerのmethod ← 2)の追加部分です
class MypagesController < ApplicationController def index @users = User.all end def show @user = User.find(params[:id]) @photopost = current_user.photoposts.build @myphotopost = @user.photoposts ←実はこの部分で本来は@photopostとしたかったのですが、1行上の end @photopostと名前がかぶってしまいそうするとform_forが 数値を拾わなくなってしまい入力フォームを描画してくれないので end 別の名前のインスタンス変数に入れ直そうとした為変になっています
Photopostモデル
class Photopost < ApplicationRecord belongs_to :user mount_uploader :picture, PictureUploader validates :user_id, presence: true validates :picture, presence: true validates :content, presence: true end
Userモデル
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable has_many :photoposts, dependent: :destroy devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :omniauthable def self.find_for_oauth(auth) user = User.where(uid: auth.uid, provider: auth.provider).first unless user user = User.create( uid: auth.uid, provider: auth.provider, email: auth.info.email, name: auth.info.name, password: Devise.friendrly_token[0, 20], image: auth.info.image ) end user end end
1) 「描画するパーシャル」はどのviewから呼ばれますか?
2) そのviewを呼ぶcontrollerのmethod(アクション)のcodeを載せてください
3) image_tag @myphotopost とありますが、これはimage_tag @photopost のまちがい?
1) /insta_clone/app/views/photoposts/_photopost.html.erb から呼ばれています。
2) 質問内容編集して追記しているので確認してもらえるとありがたいです。汗
3) 間違いだった為こちらも質問内容修正してあります。
保存されていない なのですか? 保存されているが表示されなのですか?
質問のタイトルが前者ですからそのつもりで考えています。
1)はそれもpartialなのでベースとなるviewを教えてください。もしかしてshow?
2)はshowのmethosがでてますが、それで新規photopostのpstするのですか?
標準と違う構成で作るのは構いませんがそれが回答者に伝わるように書いていただかないとこちら混乱するばかりです
保存されていないの解釈であっています!
知識不足で文が変になってしまい申し訳ありません汗
1)についてshowがベースのviewになっています。
2)についてなのですが、photopost用のコントローラーを作っていてその中にcreateメソッドがありそちらでポストしています。
showの方は表示させるために@photopostに@user.photopostsを入れているという感じです汗
という構成であるとすると、載っているcodeではsaveはできるのでは、、、
Photopost のcodeとUserの関連定義を載せていただけますか
関連定義とはモデルの多対一のような関係を表すコードで合っていますでしょうか?
Userと Photopostのモデルを追記してるあるのですみませんがみてもらえるとありがたいです汗
Railsチュートリアルのマイクロポストの画像投稿機能を元にして、投稿用のviewと投稿した画像を表示するviewを別々にしてコントローラーなどもそれに合わせて変更したら保存されて画像とコンテントを描画することができました!
今回の詳しい原因はわからなかったのですが、もう少しMVCを理解してから次のアプリは開発しようと思います。
winterboumさん、私の知識不足で変な質問をしてしまいすみませんでした色々と教えてもらって本当にありがとうございます!
回答1件
あなたの回答
tips
プレビュー