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

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

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

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

Q&A

解決済

1回答

3597閲覧

仮想的な属性(Virtual Attributes)がある複数ステップの登録フォームを作成する

mamoth810

総合スコア8

Ruby on Rails 5

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

0グッド

0クリップ

投稿2019/07/23 22:56

前提・実現したいこと

複数ステップを利用してユーザー情報を新規登録したいです。

Railsを用いてユーザ登録機能を作っています。
仮想的な属性(Virtual Attributes)がある複数ステップの登録フォームを採用し、実施しています。
1画面目に「姓」「名」をそれぞれ分けて入力するテキストフォームがあるのですが、
DBでは1つのカラム「username」などとマージする処理をModelで定義してます。
1ステップのみであれば問題なく登録まで完了できたのですが、
複数ステップに分けた場合、2画面目に「姓」「名」の情報を引き継ぐことがうまくできません。
Modelの方でVirtual Attributesを使用して「姓」「名」を入力できるように設定しています。
そのVirtual Attributesをmargeさせることで「名前」としてDBに格納する設計にしてます。

発生している問題・エラーメッセージ

wrong number of arguments (given 2, expected 1)

2画面目に「姓」「名」の情報が引き継がれなくnilがDBに格納されてしまう。

該当のソースコード

Modelソース

rails

1 def firstname 2 @firstname 3 end 4 5 def lastname 6 @lastname 7 end 8 9 #DBカラムはusernameなので@firstname, @lastnameを結合する 10 def set_username 11 unless @firstname == nil 12 self.username = [@lastname, @firstname].join(" ") 13 end 14 end

Controllerソース

@user = User.new(username: params[:lastname, :firstname].join(" "), email: params[:email])

試したこと

Sessionにて引数を管理しましたが、DBに登録するタイミングで該当するパラメーターがなくエラーとなりました。
またストロングパラメーターを使用せずに直接インスタンス変数に代入しようとすると「wrong number of arguments (given 2, expected 1)」と表示されてマージできません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

winterboum

2019/07/23 23:47

具体的にどうしたいのか、がわからないので回答しにくいです。 うまく引き継がれるようになったとしたら、どう引き継いでつなげるのか各stepのviewとcontrollerを見せて頂けますか。
mamoth810

2019/07/23 23:55

1画面目で入力した「姓」「名」をそのままパラメーターとして2画面目まで保持させたいです。2画面目にてcreateメゾットになるので、そこでmodelで定義しているカラム編集をしたいと思ってます。
guest

回答1

0

ベストアンサー

def firstname @firstname end def lastname @lastname end


attr_accessor :firstname, :lastname
で良いです。

firstname,lastname を後に渡すのには

ひとつ目の画面 →
ひとつ目の controller にて、@userに入れておく

2つめの画面
hidden_field で:firstname,:lastname に入れておく

投稿2019/07/26 09:04

winterboum

総合スコア23347

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

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

mamoth810

2019/08/01 02:59

modelに attr_accessor :lastname, :firstname で対応しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問