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

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

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

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

Q&A

解決済

1回答

449閲覧

関連付けたモデルのデータをフォーム送信する方法が分かりません(rails)

yamady

総合スコア176

Ruby on Rails

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

0グッド

0クリップ

投稿2017/06/27 05:25

お世話になっております。
Ruby on Railsで「ユーザーと紐付いている別モデル」にフォーム送信するようにしたいと考えているのですが、どうやってやるべきなのかがなかなか見えず困っています・・・

具体的に言うと、Facebookカバー写真を設置するために「UserImage」モデルを作成しており、これにアップロードするための方法が分からないということです。
CarrierWaveを使用しているため、ユーザーモデルにカバー写真が紐付けられていません。

開発環境
・Rails 5.0.0.1
・Carrier Wave
・Devise

##該当するソースコード

views/devise/registration/edit.html.erb

ruby

1<% provide(:title, "アカウントの編集") %> 2<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %> 3<%= devise_error_messages! %> 4<section class="mypage-profile"> 5 <div class="container mypage-form title"> 6 <div class="title-text"> 7 <h2>プロフィールの編集</h2> 8 </div> 9 <form> 10 <div class="form-group"> 11 <%= f.label :name, "ユーザー名" %> 12 <%= f.text_field :name, :placeholder => "ユーザー名", :value => @user.name, class: "form-control" %> 13 </div> 14 15 <!-- ここがUserImageモデルに紐付いているカラム --> 16 <div class="form-group"> 17 <%=f.label :image,"ユーザー画像" %> 18 <%= f.file_field :image %> 19 </div> 20 <div class="form-group"> 21 <%=f.label :image,"カバー画像" %> 22 <%= f.file_field :cover_image %> 23 </div> 24 <!-- /ここがUserImageモデルに紐付いているカラム --> 25 26 <div class="form-group"> 27 <%= f.label :description, "自己紹介" %> 28 <%= f.text_area :description, :placeholder => "自己紹介", :size => "10x10", :value => @user.description, class: "form-control" %> 29 </div> 30 <%= f.submit "登録内容を変更する", class: "btn btn-form" %><br /> 31 </form> 32 <% end %> 33 </div> 34</section>

user.rb

ruby

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :trackable, :validatable, 6 :omniauthable 7 has_many :reviews, dependent: :destroy 8 has_many :user_images 9 10 class << self 11 def find_for_facebook_oauth(auth) 12 where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 13 user.email = auth.info.email 14 user.password = Devise.friendly_token[0,20] 15 user.name = auth.info.name 16 end 17 end 18 19 def create_unique_string 20 SecureRandom.uuid 21 end 22 23 def create_unique_email 24 User.create_unique_string + "@example.com" 25 end 26 end 27 28 private 29 30 def user_params 31 params.require(:user).permit(:name, :email) 32 end 33end

user_image.rb

ruby

1class UserImage < ApplicationRecord 2 belongs_to :user 3 4 mount_uploader :image, ThumbnailUploader 5 mount_uploader :cover_image, ThumbnailUploader 6end

users_controller.rb

ruby

1class UsersController < ApplicationController 2 3 def new 4 @user_image = User.new(create_params) 5 2.times { @user.user_images.build } 6 end 7 8 def show 9 @user = User.find(params[:id]) 10 end 11 12 private 13 14 def user_params 15 params(:user).permit(:name, :email, :background, :description) 16 end 17 18 def create_params 19 params.require(:users).permit(user_images_attributes: [:image, :cover_image]) 20 end 21end

##試してみたこと

form_for の中にform_forしてみましたが、やり方が悪いのかできませんでした・・・汗

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

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

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

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

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

guest

回答1

0

ベストアンサー

nested_attribute_for と fields_forを使いましょう。
後、Carrier Waveの使い方が間違っている気がします。
Carrier Waveは一つのモデルに対し一つしか画像を添付できません。
なので、user_imageに別カラム(例えばhoge:integer)を作り
hogeが0ならカバー1ならユーザーみたいにする必要があると思います。
で以下が修正した内容です。
動作は未確認です。あとは工夫して見てください。

ruby

1 def new 2 @user_image = User.new(create_params) 3 2.times {|i| @user.user_images.build(hoge: i)} 4 end

ruby

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :trackable, :validatable, 6 :omniauthable 7 has_many :reviews, dependent: :destroy 8 has_many :user_images 9 accepts_nested_attributes_for :user_images#追加 10 class << self 11 def find_for_facebook_oauth(auth) 12 where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 13 user.email = auth.info.email 14 user.password = Devise.friendly_token[0,20] 15 user.name = auth.info.name 16 end 17 end 18 19 def create_unique_string 20 SecureRandom.uuid 21 end 22 23 def create_unique_email 24 User.create_unique_string + "@example.com" 25 end 26 end 27 28 private 29 30 def user_params 31 params.require(:user).permit(:name, :email,user_images_attributes: [:image])#追加 32 end 33end

ruby

1<% provide(:title, "アカウントの編集") %> 2<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %> 3<%= devise_error_messages! %> 4<section class="mypage-profile"> 5 <div class="container mypage-form title"> 6 <div class="title-text"> 7 <h2>プロフィールの編集</h2> 8 </div> 9 <form> 10 <div class="form-group"> 11 <%= f.label :name, "ユーザー名" %> 12 <%= f.text_field :name, :placeholder => "ユーザー名", :value => @user.name, class: "form-control" %> 13 <%= f.hidden :hoge %> 14 </div> 15 16 <!-- ここがUserImageモデルに紐付いているカラム --> 17<%= f.fields_for :user_images_attributes do |a| %> 18 <div class="form-group"> 19 <%= a.label :image, a.object.hoge==0 ? 'カバー画像':'ユーザー画像' %> 20 <%= a.file_field :image %> 21 </div> 22<% end %> 23 <!-- /ここがUserImageモデルに紐付いているカラム --> 24 25 <div class="form-group"> 26 <%= f.label :description, "自己紹介" %> 27 <%= f.text_area :description, :placeholder => "自己紹介", :size => "10x10", :value => @user.description, class: "form-control" %> 28 </div> 29 <%= f.submit "登録内容を変更する", class: "btn btn-form" %><br /> 30 </form> 31 <% end %> 32 </div> 33</section>

投稿2017/06/27 10:12

編集2017/06/27 10:14
moke

総合スコア2241

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

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

yamady

2017/06/27 14:01

mokeさま、詳しいご説明をいつも本当にありがとうございます。非常に参考になる回答となりました。ここまでご説明いただけると、立ち返ってできそうです!
moke

2017/06/27 14:34 編集

どういたしまして、定期的に似たような質問に答えている気がしますが。 Carrier Waveは一つのモデルに対し一つしか画像を添付できません。 が基本なので、わからなくなったら基本に立ち返って下さいね 頑張って下さい????
yamady

2017/06/28 09:47

ありがとうございます(そして、同じような質問すみません>< 基本に立ち返るくせをつけていこうと思います!! どうぞよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問