###実現したいこと
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の使い方
###エラー情報
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)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/30 03:24