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

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

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

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

Ruby on Rails

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

Ruby on Rails 4

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

Q&A

解決済

1回答

3327閲覧

deviseのsign_up画面で 1(userモデル):N(別モデル)の関係にあるモデルにデータを登録(一括登録)できない

begenner

総合スコア79

Ruby

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

Ruby on Rails

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

Ruby on Rails 4

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

0グッド

0クリップ

投稿2017/12/10 07:14

編集2017/12/11 12:49

###実現したいこと
deviseのsignup時に1画面で
userモデルと別のモデル(s_adress ・ b_adressモデル)
にも登録を行いたいです。
(s_adress、b_adressの入力フォームはf.fields_forで入力画面を作成しています)

deviseのsign_up時のコントローラーは下記サイトを参考に作成しました
Rails4でdeviseのControllerをカスタマイズする

###現在のエラー状況
create時に下記のエラーが出ます。
saveでuserモデルには登録されていますが、他のモデルにはレコードが登録されず、登録できずに登録画面に戻るときに下記のエラーが表示されます。
webrickのlog(下部に記載あり) を見ると

renderでnew画面に遷移しようとしている時に多くのrenderメソッドによって関係ないを読み込んでいるようにみえる

のですが原因がわかりません。
ご助力いただきますようお願いいたします(m_ _m)
###試したこと
下記のサイトなどを参考にしてrescueメソッドなどを利用して画面遷移を考えたのですがうまくいきませんでした。

【Rails】複数のレコードを作成する。modelの関係性によって異なるform_for / fields_forの使い方

1アクションで複数のモデルを同時に保存するには?

【Rails】コントローラの中で途中で抜ける方法

###エラー情報
AbstractController::DoubleRenderError in Users::RegistrationsController#create

Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".

app/controllers/users/registrations_controller.rb:27:in `create'

###動作環境
OS:mac
Ruby:2.3.5
Ruby on Rails: 4.2.5
###各コード
データベース

ruby

1#schema.rb 2 #userモデルのカラム一覧 3 create_table "users", force: :cascade do |t| 4 t.string "name", limit: 255 5 t.string "email", limit: 255, default: "", null: false 6 t.string "encrypted_password", limit: 255, default: "", null: false 7 . 8 end 9 10#s_adressモデルのカラム一覧 11 create_table "s_adresses", force: :cascade do |t| 12 t.integer "user_id", limit: 4 13 t.string "s_name", limit: 255, null: false 14 end 15 16#b_adressモデルのカラム一覧 17 create_table "b_adresses", force: :cascade do |t| 18 t.integer "user_id", limit: 4 19 t.string "b_name", limit: 255, null: false 20 end

controller部分

ruby

1#app/controllers/application_controller.rb 2class ApplicationController < ActionController::Base 3 protect_from_forgery with: :exception 4 before_action :configure_permitted_parameters, if: :devise_controller? 5 6 def after_sign_out_path_for(resource) 7 root_path 8 end 9 10 def after_sign_in_path_for(resource) 11 user_path(resource) 12 end 13 14 protected 15 16 def configure_permitted_parameters 17 added_attrs = [:name,:email, :password, :password_confirmation, :s_adress] 18 devise_parameter_sanitizer.permit :sign_up, keys: added_attrs 19 devise_parameter_sanitizer.permit :account_update, keys: added_attrs 20 end 21end 22 23#app/controllers/users/registrations_controller.rb 24 def new 25 super 26 @user = User.new 27 @user.s_adresses.build 28 @user.b_adresses.build 29 end 30 31 def create 32 super 33 @user = User.new(user_params) 34 # @user.s_adresses.build 35 # @user.b_adresses.build 36 if @user.save 37 redirect_to user_path 38 else 39 # redirect_to new_user_registration_path 40 41#ここでエラーが起きていると言われる↓↓↓ 42 redirect_to new_user_registration_path(user_params) and return 43 44 # render 'new' and return 45 #:new #:action => 'users/registrations/new' 46 end 47 end 48 . 49 . 50 def user_params 51 params.require(:user).permit(:email, :password, :password_confirmation, :name, :s_adress, :b_adress, s_adress_attributes: [ :s_name],b_adress_attributes: [ :b_name], ) 52 end 53 54#app/controllers/users_controller.rb 55class UsersController < ApplicationController 56 def new 57 @user = User.new 58 end 59 . 60 . 61end

model部分

ruby

1#app/models/user.rb 2class User < ActiveRecord::Base 3 has_many :s_adresses 4 accepts_nested_attributes_for :s_adresses 5 has_many :b_adresses 6 accepts_nested_attributes_for :b_adresses 7 8 devise :database_authenticatable, :registerable, 9 :recoverable, :rememberable, :trackable, :validatable 10end 11 12#app/models/b_adress.rb 13class BAdress < ActiveRecord::Base 14 belongs_to :user 15end 16 17#app/models/s_adress.rb 18class SAdress < ActiveRecord::Base 19 belongs_to :user 20end

view部分

ruby

1<!--app/views/users/registrations/new.html.erb--> 2<h2>新規登録</h2> 3 4<!--userモデル登録部分---> 5<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> 6 <%= devise_error_messages! %> 7 <!--メールアドレス--> 8 <div class="field"> 9 <%= f.label :email, 'メールアドレス' %><br /> 10 <%= f.email_field :email, autofocus: true %> 11 </div> 12 <!--パスワード--> 13 <div class="field"> 14 <%= f.label :password, 'パスワード(英数字6文字以上)' %><br /> 15 <%= f.password_field :password, autocomplete: "off" %> 16 </div> 17 <!--パスワード確認用--> 18 <div class="field"> 19 <%= f.label :password_confirmation, 'パスワード(確認用)' %><br /> 20 <%= f.password_field :password_confirmation, autocomplete: "off" %> 21 </div> 22 <!--名前--> 23 <div class="field"> 24 <%= f.label :name, '名前' %><br /> 25 <%= f.text_field :name, placeholder: "名前", autofocus: true %> 26 </div> 27 28<!--s_adressモデル登録部分--> 29<h2>配送先住所</h2> 30 <%= f.fields_for :s_adress do | s | %> 31 <!--宛名--> 32 <div class="field"> 33 <%= s.label :s_name, '宛名' %><br /> 34 <%= s.text_field :s_name, placeholder: "いいい", autofocus: true %> 35 </div> 36 <% end %> 37<!--s_adressモデル登録終了部分--> 38<!--b_adressモデル登録部分--> 39<h2>請求先住所</h2> 40 <%= f.fields_for :b_adress do | b | %> 41 42 <!--宛名--> 43 <div class="field"> 44 <%= b.label :b_name, '宛名' %><br /> 45 <%= b.text_field :b_name, placeholder: "宛名", autofocus: true %> 46 </div> 47 <% end %> 48<!--b_adressモデル登録部分終了--> 49 <div class="actions"> 50 <%= f.submit "登録する" %> 51 </div> 52<% end %> 53<%= link_to "ログイン画面へ", new_session_path(resource_name) %><br /> 54

###webrickによるログの事例

Started POST "/users" for 127.0.0.1 at 2017-12-10 14:56:04 +0900 Processing by Users::RegistrationsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"EfMlapBDIN18tr5R1xO8CcRLjU6TQDhrVrEORdIkO/NiatlLuF8wdVj/U/catGn9pJlVPu16fkBrbgBAExXbXg==", "user"=>{"email"=>"12@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "name"=>"user12", "s_adress"=>{"s_name"=>"user12-1" }, "b_adress"=>{"b_name"=>"user12-2" } }, "commit"=>"登録する"} Unpermitted parameters: s_adress, b_adress (0.3ms) BEGIN User Exists (0.6ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY '12@gmail.com' LIMIT 1 SQL (0.4ms) INSERT INTO `users` ( `email`, `encrypted_password`, `name`, `created_at`, `updated_at`) VALUES ( '12@gmail.com', '$2a$11$SokwNar9rIrU4jODwxkmnOuqxT66giQzGiOI/77lMmWhw8l2NP7vm', 'user12', '2017-12-10 05:56:05', '2017-12-10 05:56:05') (1.8ms) COMMIT (0.2ms) BEGIN SQL (0.4ms) UPDATE `users` SET `last_sign_in_at` = '2017-12-10 05:56:05', `current_sign_in_at` = '2017-12-10 05:56:05', `last_sign_in_ip` = '127.0.0.1', `current_sign_in_ip` = '127.0.0.1', `sign_in_count` = 1, `updated_at` = '2017-12-10 05:56:05' WHERE `users`.`id` = 34 (0.5ms) COMMIT Redirected to http://localhost:3000/users/34 Unpermitted parameters: s_adress, b_adress (0.2ms) BEGIN User Exists (0.4ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY '12@gmail.com' LIMIT 1 (0.2ms) ROLLBACK Unpermitted parameters: s_adress, b_adress Redirected to Completed 500 Internal Server Error in 479ms (ActiveRecord: 4.9ms) AbstractController::DoubleRenderError (Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".): app/controllers/users/registrations_controller.rb:27:in `create' (下記の ... には /Users/xxx/.rbenv/versions/xxx/lib/ruby/gems/xxx/gems が記述されています) Rendered ... /actionpack-4.2.5/lib/action_dispatch/middleware/templates/rescues/_source.erb (8.3ms) Rendered ... /actionpack-4.2.5/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (8.1ms) Rendered ... /actionpack-4.2.5/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (2.3ms) Rendered ... /actionpack-4.2.5/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (110.9ms) Rendered ... /web-console-2.3.0/lib/web_console/templates/_markup.html.erb (1.2ms) Rendered ... /web-console-2.3.0/lib/web_console/templates/_inner_console_markup.html.erb within layouts/inlined_string (1.6ms) Rendered ... /lib/web_console/templates/_prompt_box_markup.html.erb within layouts/inlined_string (1.0ms) Rendered ... /lib/web_console/templates/style.css.erb within layouts/inlined_string (1.0ms) Rendered ... /web-console-2.3.0/lib/web_console/templates/console.js.erb within layouts/javascript (96.7ms) Rendered ... /lib/web_console/templates/main.js.erb within layouts/javascript (1.1ms) Rendered ... /lib/web_console/templates/error_page.js.erb within layouts/javascript (1.5ms) Rendered ... /lib/web_console/templates/index.html.erb (222.9ms)

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

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

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

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

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

guest

回答1

0

ベストアンサー

#app/controllers/users/registrations_controller.rb (略) def create super ←

この時点で既に親クラス(Devise::RegistrationsController)のcreateメソッドが呼ばれてしまっているので、リダイレクトもそっちでやってしまっているのではないでしょうか。
その上でまたリダイレクト呼ぼうとしてるのでダブルレンダーエラーになっているのでは?

投稿2019/01/30 03:23

perpouh

総合スコア299

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

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

perpouh

2019/01/30 03:24

17年の投稿だった……
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問