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

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

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

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

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

0回答

2117閲覧

has_many throughの中間テーブルの値をポップアップウィンドウで選び、fields_forで編集する方法について

KoukoMatsumoto

総合スコア41

Ruby

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

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

1クリップ

投稿2015/02/15 07:53

has_many throughの関係にある中間テーブルの、fields_forのフォームに埋め込む内容を、新規ウィンドウのポップアップで選択した値を反映させたいと思っております。

こういった実装なので、ポップアップから戻ってくると親ウィンドウのグローバル変数は空になってしまうため、上手く連携できません。
form_tagで親モデルとは切り離した実装にするしかないでしょうか。
できるだけfields_forを用いたいと思ってます。
また、チェックボックスで別窓で選んだ値をちゃんと、@post.usersで呼び出せるようにするためには、どのタイミングでどういった記述が必要でしょうか。

問題点:
・中間テーブルのidを選ばせるだけでなく、中間テーブルにmemoというテキスト要素があり、こちらも編集の必要があるため、collection_check_boxesやnested_form等、IDだけを選ばせるものが利用できない
・ポップアップから戻って来る際に、親ウィンドウ側のform_forのf変数は空っぽになるので、f.fields_forができない

不明点:
・紐づけたいusers_posts の値を削除、追加する場合、@post.usersでDB保存前の要素をチェックボックで選択したものにどのタイミングで挿入させることができるのか?
・create, updateの @post.save!で、今回追加・削除するusers_posts関連テーブルのバリデーションチェックも一度に行えるか?

※以下は参考までにこんな感じ、で書いているソースなので細かいエラーがあったらスミマセン…

model

所持カラム

id, titie, contents ...

lang

1class Post < ActiveRecord::Base 2 has_many :posts_users 3 has_many :authors, :through => :posts_users 4 validates :title, presence: true 5 accepts_nested_attributes_for :users 6end

所持カラム

id, name, email

lang

1class User < ActiveRecord::Base 2 has_many :posts_users 3 has_many :posts, :through => :posts_users 4end

所持カラム

user_id, post_id, memo

lang

1class UsersPost < ActiveRecord::Base 2 belongs_to :post 3 belongs_to :user 4 validates :memo, presence: true 5end

メインの選択部分
view
app/views/posts/_form.html.erb

lang

1<%= form_for(@post) do |f| %> 2 <%= f.text_field :title %> 3 ..... 4 <%= render "form_posts", f: f %> 5 .... 6 <%= f.submit "登録" %> 7<% end %>

メイン選択部分で別ウィンドウで選んだ中間テーブルの結果と、中間テーブルのmemo要素を更新するフォーム(ajax対応)
app/views/posts/_form_posts.html.erb

locals f

lang

1<div id="_posts"> 2 # ここの@postと、f が、別ウィンドウから選択して戻ったときに消えてしまう 3 # @post.usersで、選択した中間テーブルの内容を呼べる方法が分からない 4 <% @post.users.each do |user| %> 5 <%= f.fields_for :users, user do |user_field| %> 6 <%= user.name %> / 7 <%= author_field.text_field :memo %> 8 <% end %> 9 <% end %> 10</div> 11<%= link_to "検索", select_users_posts_path, :target => "_blank" %>

別ウィンドウの中間テーブルID選択部分の表示部
app/views/posts/select_users.html.erb

lang

1<%= form_for(url: set_users_posts_path) %> 2 <% @users.each do |user| %> 3 <% check_box_tag "check_user_id[]", user.id %> 4 <% end %> 5 <%= submit_tag "送信" %> 6<% end %>

jsファイル

lang

1app/views/set_users.js.erb 2$('#_posts').html('<%= j( render( 'form_posts' ) ) %>');

controller
app/controllers/posts_controller.rb

lang

1before_action :set_post, only: [:edit, :update] 2 3def new 4 @post = Post.new 5end 6 7def edit 8 @post = Post.find(params[:id]) 9end 10 11def create 12 @post = Post.new(post_params) 13 begin 14 # ここの処理で、Postのみでなく、UsersPostのバリデーションも一括でチェックしたい 15 @post.save! 16 rescue 17 render "new" 18 end 19end 20 21def update 22 @post.attribute = post_params 23 begin 24 @post.save! 25 rescue 26 render "edit" 27 end 28end 29 30def select_users 31 @users = User.all 32end 33 34def set_users 35 @users = User.where(id: params[:check_user_id]) 36 # ここで、チェックボックスで選択した中間テーブルを@post.usersで保存無しで呼べるような処理を書きたい 37end 38 39private 40 def set_post 41 @post = Post.find(params[:id]) 42 end 43 44 def post_params 45 params.require(:post).permit(:title, :msg, authors_attributes: [:memo]) 46 end

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問