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

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

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

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

Q&A

解決済

1回答

4611閲覧

rails wrong number of arguments を解決したい

eru_desu

総合スコア2

Ruby on Rails

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

0グッド

0クリップ

投稿2020/10/22 04:16

前提・実現したいこと

簡単なTweetappを作ろうとしています。
投稿機能を作る際にscaffledを使いました。
ユーザー個人の投稿一覧を作りたいので
upload controller のcreateメソッドに@current_user.id(投稿したひとのID)を追加したいです。

初めての質問で伝わりづらいかもしれません。
回答いただけると幸いです。

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

送る値と帰ってくる値の数が違うらしいのですがどう対処したらいいのわかりません。

ArgumentError in UploadsController#create wrong number of arguments (given 2, expected 0..1)

該当のソースコード 

ruby

1class UploadsController < ApplicationController 2before_action :set_upload, only: [:show, :edit, :update, :destroy] 3before_action :authenticate_user 4 # GET /uploads 5 # GET /uploads.json 6 def index 7 @uploads = Upload.all.order(created_at: :desc) 8 end 9 10 # GET /uploads/1 11 # GET /uploads/1.json 12 def show 13 end 14 15 # GET /uploads/new 16 def new 17 @upload = Upload.new 18 end 19 20 # GET /uploads/1/edit 21 def edit 22 end 23 24 # POST /uploads 25 # POST /uploads.json 26 def create 27 @upload = Upload.new(upload_params, user_id: @current_user.id) 28 29 respond_to do |format| 30 if @upload.save 31 format.html { redirect_to @upload, notice: 'Upload was successfully created.' } 32 format.json { render :show, status: :created, location: @upload } 33 else 34 format.html { render :new } 35 format.json { render json: @upload.errors, status: :unprocessable_entity } 36 end 37 end 38 end 39 40 # PATCH/PUT /uploads/1 41 # PATCH/PUT /uploads/1.json 42 def update 43 respond_to do |format| 44 if @upload.update(upload_params) 45 format.html { redirect_to @upload, notice: 'Upload was successfully updated.' } 46 format.json { render :show, status: :ok, location: @upload } 47 else 48 format.html { render :edit } 49 format.json { render json: @upload.errors, status: :unprocessable_entity } 50 end 51 end 52 end 53 54 # DELETE /uploads/1 55 # DELETE /uploads/1.json 56 def destroy 57 @upload.destroy 58 respond_to do |format| 59 format.html { redirect_to uploads_url, notice: 'Upload was successfully destroyed.' } 60 format.json { head :no_content } 61 end 62 end 63 64 private 65 # Use callbacks to share common setup or constraints between actions. 66 def set_upload 67 @upload = Upload.find_by(id: params[:id]) 68 end 69 70 # Only allow a list of trusted parameters through. 71 def upload_params 72 params.require(:upload).permit(:image, :title, :body) 73 end 74end 75 76

from viwe

<%= form_with(model: upload, local: true) do |form| %> <% if upload.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(upload.errors.count, "error") %> prohibited this upload from being saved:</h2> <ul> <% upload.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= form.label :image %> <%= form.file_field :image %> </div> <div class="field"> <%= form.label :名前 %> <%= form.text_field :title %> </div> <div class="field"> <%= form.label :値段 %> <%= form.text_field :body %> </div> <div class="actions"> <%= form.submit %> </div> <% end %>

ここに問題に対して試したことを記載してください。
from を<%= form_with(model: upload, local: true) do |form| %>から<%=form_tag>
にかえ<input name="">で記述し、createメソッドの受け取りを Upload.new(title: params[:title])などと記述したのですがうまくいきませんでした。

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

Ruby 2.5.7
Rails 5.2.3
PostgreSQL

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

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

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

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

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

guest

回答1

0

ベストアンサー

ここは以下のようにしつつ、upload_paramsにcurrent_user.idを追加するのが適切に思いました

@upload = Upload.new(upload_params)
def upload_params params.require(:upload).permit(:image, :title, :body).merge(user_id: @current_user.id) end

upload_paramsにmergeで@current_user.idを追加しています(@current_userはどこで定義されているかはわかっていないですが、質問から借りました)
古い記事ですが、mergeについてはこちらが参考になるかもです。
mergeメソッドで、入力してもらったparamsと一緒に予め別のテーブルに持っている情報を保存する

投稿2020/10/22 05:04

hatsu

総合スコア1809

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

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

eru_desu

2020/10/22 09:44

回答ありがとうございます。 試したところうまくいきました! この書き方はストロングパラメータという記述方法で、安全性を保つ上で必須ということがわかりました。 .mergeを使うことでパラメータで受け取れない値も記入することができるということがわかりました。 回答いただき本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問