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

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

ただいまの
回答率

90.87%

  • Ruby

    6747questions

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

  • Ruby on Rails

    6534questions

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

  • Ruby on Rails 4

    2370questions

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

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 178

tshr

score 20

実現したいこと

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

各コード

データベース

#schema.rb
 #userモデルのカラム一覧
  create_table "users", force: :cascade do |t|
    t.string   "name",                   limit: 255
    t.string   "email",                  limit: 255, default: "", null: false
    t.string   "encrypted_password",     limit: 255, default: "", null: false
     .
  end

#s_adressモデルのカラム一覧
  create_table "s_adresses", force: :cascade do |t|
    t.integer  "user_id",       limit: 4
    t.string   "s_name",        limit: 255, null: false
  end

#b_adressモデルのカラム一覧
  create_table "b_adresses", force: :cascade do |t|
    t.integer  "user_id",       limit: 4
    t.string   "b_name",        limit: 255, null: false
  end

controller部分

#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters, if: :devise_controller?

  def after_sign_out_path_for(resource)
    root_path
  end

  def after_sign_in_path_for(resource)
    user_path(resource)
  end

  protected

  def configure_permitted_parameters
    added_attrs = [:name,:email, :password, :password_confirmation, :s_adress]
    devise_parameter_sanitizer.permit :sign_up, keys: added_attrs
    devise_parameter_sanitizer.permit :account_update, keys: added_attrs
  end
end

#app/controllers/users/registrations_controller.rb
  def new
    super
    @user = User.new
    @user.s_adresses.build
    @user.b_adresses.build
  end

  def create
    super
      @user = User.new(user_params)
      # @user.s_adresses.build
      # @user.b_adresses.build
      if @user.save
      redirect_to user_path
      else
        # redirect_to new_user_registration_path

#ここでエラーが起きていると言われる↓↓↓
        redirect_to new_user_registration_path(user_params) and return

        # render 'new' and return
        #:new #:action => 'users/registrations/new'
      end
  end
  .
  .
    def user_params
      params.require(:user).permit(:email, :password, :password_confirmation, :name, :s_adress, :b_adress, s_adress_attributes: [ :s_name],b_adress_attributes: [ :b_name], )
    end

#app/controllers/users_controller.rb
class UsersController < ApplicationController
  def new
    @user = User.new
  end
  .
  .
end

model部分

#app/models/user.rb
class User < ActiveRecord::Base
  has_many :s_adresses
  accepts_nested_attributes_for :s_adresses
  has_many :b_adresses
  accepts_nested_attributes_for :b_adresses

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end

#app/models/b_adress.rb
class BAdress < ActiveRecord::Base
  belongs_to :user
end

#app/models/s_adress.rb
class SAdress < ActiveRecord::Base
  belongs_to :user
end

view部分

<!--app/views/users/registrations/new.html.erb-->
<h2>新規登録</h2>

<!--userモデル登録部分--->
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>
    <!--メールアドレス-->
    <div class="field">
      <%= f.label :email, 'メールアドレス' %><br />
      <%= f.email_field :email, autofocus: true %>
    </div>
    <!--パスワード-->
    <div class="field">
      <%= f.label :password, 'パスワード(英数字6文字以上)' %><br />
      <%= f.password_field :password, autocomplete: "off" %>
    </div>
    <!--パスワード確認用-->
    <div class="field">
      <%= f.label :password_confirmation, 'パスワード(確認用)' %><br />
      <%= f.password_field :password_confirmation, autocomplete: "off" %>
    </div>
    <!--名前-->
    <div class="field">
      <%= f.label :name, '名前' %><br />
      <%= f.text_field :name, placeholder: "名前", autofocus: true %>
    </div>

<!--s_adressモデル登録部分-->
<h2>配送先住所</h2>
    <%= f.fields_for :s_adress do | s | %>
        <!--宛名-->
        <div class="field">
          <%= s.label :s_name, '宛名' %><br />
          <%= s.text_field :s_name, placeholder: "いいい", autofocus: true %>
        </div>
    <% end %>
<!--s_adressモデル登録終了部分-->
<!--b_adressモデル登録部分-->
<h2>請求先住所</h2>
    <%= f.fields_for :b_adress do | b | %>

        <!--宛名-->
        <div class="field">
          <%= b.label :b_name, '宛名' %><br />
          <%= b.text_field :b_name, placeholder: "宛名", autofocus: true %>
        </div>
    <% end %>
<!--b_adressモデル登録部分終了-->
  <div class="actions">
    <%= f.submit "登録する" %>
  </div>
<% end %>
<%= link_to "ログイン画面へ", new_session_path(resource_name) %><br />

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)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 90.87%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    6747questions

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

  • Ruby on Rails

    6534questions

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

  • Ruby on Rails 4

    2370questions

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

  • トップ
  • Rubyに関する質問
  • deviseのsign_up画面で 1(userモデル):N(別モデル)の関係にあるモデルにデータを登録(一括登録)できない