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

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

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

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

Q&A

解決済

1回答

1728閲覧

Railsでトップページに会員登録フォームを設置したい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

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

0グッド

0クリップ

投稿2019/04/05 03:31

前提・実現したいこと

Ruby on RailsでQiitaのようなレイアウトのサイトを作成しようとしています。
Qiitaのように、トップページ(https://qiita.com/)とユーザー登録ページ(https://qiita.com/signup?redirect_to=%2F)の両方にユーザー登録フォームを設置したいと思っています。

現在、

  • トップページはTopPageコントローラおよびTopPageビュー
  • ユーザーページはUsersコントローラおよびUsersビュー

という構成なのですが、
トップページからUsersコントローラにリクエストを送信するフォームを設置する方法がわかりません。

解決策、そもそも設計がよくない、理解が間違っているなどありましたらご教授いただけると幸いです。

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

ArgumentError in TopPage#home First argument in form cannot contain nil or be empty <%= form_for(@user, url: {controller: "users", action: "new"}) do |f| %>

該当のソースコード

  • TopPageコントローラ

ruby

1class TopPageController < ApplicationController 2 def home 3 end 4end
  • TopPageビュー

ruby

1<%= form_for(@user, url: {controller: "users", action: "new"}) do |f| %> 2 <ul> 3 <li> 4 <label>ユーザー名</label> 5 <%= f.text_field :name, placeholder: "taro yamada" %> 6 </li> 7 <li> 8 <label>メールアドレス</label> 9 <%= f.email_field :email, placeholder: "yamada@example.com" %> 10 </li> 11 <li> 12 <label>パスワード</label> 13 <%= f.password_field :password, placeholder: "********" %> 14 </li> 15 <li> 16 <%= f.submit "ユーザー登録", class: "submit" %> 17 </li> 18 </ul> 19<% end %>
  • Usersコントローラ

ruby

1class UsersController < ApplicationController 2 def show 3 @user = User.find(params[:id]) 4 end 5 def new 6 @user = User.new(user_params) 7 end 8 9 private 10 11 def user_params 12 params.require(:user).permit(:name, :email, :password, 13 :password_confirmation) 14 end 15 16end
  • routes.rb

ruby

1Rails.application.routes.draw do 2 root 'top_page#home' 3 get '/signup', to: 'users#new' 4 resources :users 5 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 6end

試したこと

(1) form_forの対象にUsersnewアクションを指定する

ruby

1<%= form_for(@user, url: {controller: "users", action: "new"}) do |f| %>

ArgumentErrorが表示されます。

(2) TopPageのview内で@userを宣言する

ruby

1<% @user = User.new %> 2<%= form_for(@user, url: {controller: "users", action: "new"}) do |f| %>

→上記コードではArgumentErrorは表示されなくなりますが、
結局user_paramsメソッドを読み込めませんでした。

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

Ruby on Rails 5.2.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

First argument in form cannot contain nil or be empty

エラーの意味はformの第一引数はnilや空ではいけませんという内容です。
構文は form_for(第一引数) ということになりますので @user に何も入っていないということです。

ToppageController

ruby

1 def home 2 @user = User.new 3 end

このように@userに新規インスタンスを設定してください。そうしますと自動的に Users#createへフォームが送信されるようになりますからURLオプションも不要となります。

<%= form_for(@user) do |f| %>

最後にusers#createアクションを作成し、ユーザーをDBに保存する処理を記述してください。

投稿2019/04/05 04:24

ykp_yk

総合スコア654

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

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

退会済みユーザー

退会済みユーザー

2019/04/05 04:51

迅速でわかりやすいご回答をありがとうございます! 上記の方法でうまくいきました。 @userとform_forの処理や、 newアクションとcreateアクションを混同して考えていたようです。 教材や資料をよく確認して、理解を深めていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問