現在開発をしておりまして、チャット機能を作成中でエラーが起きます。
チャット機能は部分テンプレート化して全ページで呼び出せる様にしようと思いrenderを使っております。
topページ index.html.erb(このコントローラがエラー文のjobsです) に
<%= render partial: "chats/chat" , locals: { chat: @chats } %>
と記載し
chatsフォルダーの_chat.html.erbを作成しその中で
<div class="xxx"> <%= form_for @Chat, url: "/chats", method: "post" do |f| %> <%= f.text_field :comment, class: "xxx__xxx" %> <%= f.submit %> <% end %> </div>
とform_forでDBにコメントをPOSTで格納したいのですが、indexページをリロードすると
ArgumentError in Jobs#index エラーが出てしまいます。
コントローラーは
jobsが
def index @jobs = Job.all @chats = Chat.all end
chatsが
def new @chat = Chat.new end def create @Chat = Chat.new(message_params) @Chat.save end private def message_params params.require(:chat).permit(:comment, :student_id, :advisor_id) # .merge(user_id: current_user.id) end
となっております(質問に当たってclass定義等は割愛しております、.merge(user_id: current_user.id)
endは今後の機能でつけるためコメントアウトしております。)
部分テンプレート化する前にjobsコントローラー単体でcreateを作成した時はindexページにエラーはでず送信フォームが表示されparamsも問題なく飛んでおりました。
追記依頼編集しました
「ArgumentError in Jobs#index エラー」ですが、どの行に対して出ているとか詳細はありませんでしょうか?
index.html.erb == jobs/index.html.erb であり、中身は
<%= render partial: "chats/chat" , locals: { chat: @chats } %>
のみという認識で良いでしょうか。
_chat.html.erbも中身は記載分のみということで良いでしょうか?
気になる点がいくつかあります。
・_chat.html.erb 内で変数 chat が使われていないのはなぜか
・_chat.html.erb 内のインスタンス変数 @Chat とは何か
・インスタンス変数名が大文字と小文字のもので混在しているのはTypo?
回答可能でしたらお願いします。
maisumakun 様
<%= f.submit %>
で出ております。
https://gyazo.com/b2961899f7dfdc772bf5b9a80b2ecd59
こちらエラー画面のスクショです
Mugheart 様
index.html.erb == jobs/index.html.erb です。
rootページですので中身は render箇所以外に renderと同階層のdivタグでブロック要素があります。
その中身はeachでインスタンス変数を展開しております。
_chat.html.erbの中身は二つのブロックに別れておりまして
一つ目がDBからchatの内容を引っ張って来るブロック
二つ目が今回の送信フォームになっております。
・_chat.html.erb 内で変数 chat が使われていないのはなぜか
変数chatは送信ブロックではなく一つ目の表示ブロックで使う予定でおります。
まだDBにコメントを格納できていないのでコードは文字のベタうちになっております
_chat.html.erb 内のインスタンス変数 @Chat とは何か
form_forの@はモデルファイルと連携していると認識しておりましてchatモデルでチャット送信者A・Bとアソシエーションbelongs_to A belongs_to Bで組んであります。
モデルがDBにデータを送信すると認識しております為@モデル名と記入しました。
インスタンス変数名が大文字と小文字のもので混在しているのはTypo?
インスタンス変数の定義として左辺は定義
右辺は左辺に入れたいものと認識しております、右辺の大文字はモデルファイルのクラス名と認識しております。
当方学習初めましてまだ3ヶ月程度の初学者故間違いありましたらすいません
今回はインスタンス変数の認識違いでエラーが起きているようです。
maisumakun さんが回答してくれている通りです。
インスタンス変数はインスタンスオブジェクト内で保存される変数ですが、
イメージとしてはファイルを跨いでも値が保存されている変数です。
例えばコントローラで作成した変数をビューファイルでも使いたい!といったときに作成します。
特にインスタンス変数だからモデルと結びつくなどといったことはありません。
Mugheart さま
ご回答ありがとうございます。
当方もその認識でインスタンス変数はviewでeachで展開する際等に使っております。
form_forのリファレンスでは@部分は
form_for(モデルオブジェクト [, オプション]) do |f|
となっておりまして私の認識ではformの内容をDBに格納する為の指定先の様な位置付けで考えておりました。
今回ですとform_forの@chatがchatモデルファイルに飛んでモデルファイルがDBにデータを格納する といった流れだと思いコードを書きました。
回答1件
あなたの回答
tips
プレビュー