未定義のメソッド `Permit 'for Now!":ストリング。どこにいますか?
-
21-12-2019 - |
質問
他のスタックオーバーフロー転記のいくつかを使用してこのpermit
エラーを介して狂って仕事をしようとしていますが、それを通過してもらえないようです。私はプロジェクトモデル&コントローラとバージョンモデル&コントローラを持っています。Projects/##/versions/new
は、新しいバージョンのプロジェクトID ##を作成するためのフォームページです。しかし、送信ボタンをクリックしてバージョンを作成したら... VersionsController
に次のエラーをスローします。
undefined method `permit' for "Submit Now! ":String
Extracted source (around line #36):
34
35
36
37
38
def version_params
params.require(:version).permit(:title)
end
end
.
任意の助けが大幅に感謝されるでしょう...今までにこれを修正しようとしています。コードは次のとおりです。
routes.rb
resources :users
resources :sessions, only: [:new, :create, :destroy]
resources :projects, only: [:create, :new, :show, :edit, :update, :destroy]
resources :projects do
resources :versions
end
# get "static_pages/home"
# get "static_pages/help"
# get "static_pages/about"
#The original routes above map to...
root 'static_pages#home'
match '/signup', to: 'users#new', via: 'get'
match '/signin', to: 'sessions#new', via: 'get'
match '/signout', to: 'sessions#destroy', via: 'delete'
match '/help', to: 'static_pages#help', via: 'get'
match '/about', to: 'static_pages#about', via: 'get'
match '/contact', to: 'static_pages#contact', via: 'get'
.
プロジェクトモデル:
class Project < ActiveRecord::Base
has_many :users
has_many :versions, dependent: :destroy
validates :title, presence: true, length: { maximum: 100 }
validates :background, presence: true
validates :user_id, presence: true
default_scope -> { order('created_at DESC') }
end
.
バージョンモデル:
class Version < ActiveRecord::Base
belongs_to :project
validates :title, presence: true, length: { maximum: 140 }
default_scope -> { order('created_at DESC') }
end
.
バージョンコントローラ:
class VersionsController < ApplicationController
def new
@version = Version.new
end
def show
@project = Project.find(params[:project_id])
@version = Version.find(params[:id])
end
def index
@versions = Version.paginate(page: params[:page])
end
def create
@project = Project.find(params[:project_id])
@version = @project.versions.create(version_params)
if @version.save
flash[:success] = "You've successfully added a version to this branch..."
redirect_to project_path(@project)
else
render 'new'
end
end
def edit
end
def update
end
def destroy
end
private
def version_params
params.require(:version).permit(:title)
end
end
.
new.html.erb(新しいバージョンフォーム):
<% provide(:title, 'New Version') %>
<h1>Add a version to this project</h1>
<div class="row-fluid">
<div class="col-md-5 no-pad offset3">
<%= bootstrap_form_for @version, :url => project_versions_path do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.text_field :title %>
<br clear="all">
<%= f.submit "Submit Now! ", class: "btn btn-lg btn-primary" %>
<% end %>
</div>
</div>
.
Params:
{"utf8"=>"✓",
"authenticity_token"=>"######AAAA",
"submit"=>"Submit Now! ",
"project_id"=>"51"}
Processing by VersionsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"################=", "version"=>"Submit Now! ", "project_id"=>"51"}
Project Load (0.3ms) SELECT "projects".* FROM "projects" WHERE "projects"."id" = ? ORDER BY created_at DESC LIMIT 1 [["id", "51"]]
Completed 500 Internal Server Error in 3ms
NoMethodError (undefined method `permit' for "Submit Now! ":String):
app/controllers/versions_controller.rb:41:in `version_params'
app/controllers/versions_controller.rb:17:in `create'
. 解決
私はパラメータの問題を認識することができます。あなたはこれを持っています:
{"utf8"=>"✓",
"authenticity_token"=>"######AAAA",
"submit"=>"Submit Now! ",
"project_id"=>"51"}
.
これを持っているべきです:
{"utf8"=>"✓",
"authenticity_token"=>"######AAAA",
"project_id"=>"51",
"version"=>{"title"=>"Foo Bar"},
"button"=>""}
.
問題のある理由は、パラメータに渡されているバージョンのタイトルがないため、パラメータで新しいバージョンを作成しようとしているためです。その代わりに、この場合、この場合には「今すぐ送信!」になることが起こる最も近いものを探しますが、「送信」は強いパラメータを投げるよりも許可されていないためです。
フォームを正しく作成しているように見えますが、BOOTSTRAP_FORM_FORの問題になる可能性があります。タイトルの入力出力がどのように見えるかをフォーム上のHTMLのように投稿できますか?
その間に私は2つの提案をしています、 問題を解決する可能性がある最初のものは、 f mit を f.button に変えることです。 F.Buttonはまだ送信ボタンを作成しますが、名前を付けることができます。
コントローラでは、CREATEを呼び出した後に保存する必要はありません。作成は実際にデータベースに保存されますので、2回保存します。 create
の代わりにNewを呼び出す必要があります。@version = @project.versions.new(version_params)
if @version.save
.
チェックの新規レコード
@version = @project.versions.create(version_params)
unless @version.new_record?
.