طريقة "تصريح" غير محددة لـ "أرسل الآن!"":خيط.هل أنا على خطأ؟
-
21-12-2019 - |
سؤال
لقد كنت أحاول بجنون العمل من خلال هذا permit
خطأ في استخدام بعض منشورات StackOverflow الأخرى، ولكن يبدو أنه لا يمكن تجاوزه.لقد حصلت على نموذج المشاريع ووحدة التحكم ونموذج الإصدارات ووحدة التحكم. Projects/##/versions/new
هي صفحة نموذج لإنشاء نسخة جديدة من معرف المشروع ##.ولكن عندما أقوم بالنقر فوق زر الإرسال لإنشاء الإصدار... فإنه يلقي الخطأ التالي في ملف 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
سيكون موضع تقدير كبير أي مساعدة وكل المساعدة...لقد كنت أحاول إصلاح هذه المشكلة لفترة طويلة جدًا الآن.قانون بلدي على النحو التالي:
الطرق.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>
بارامس:
{"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 في النموذج الخاص بك؟
في غضون ذلك ، لدي اقتراحان ، أول شيء قد يحل المشكلة ، هو التغيير و.إرسال ل f. زر.سيستمر f.button في إنشاء زر إرسال، ولكنه يسمح لك بالتسمية بالطريقة التي تحاول القيام بها.
أيضًا في وحدة التحكم، لا تحتاج إلى الحفظ بعد الاتصال بالإنشاء.create سيقوم بالفعل بتخزينه في قاعدة البيانات، لذلك تقوم بحفظه مرتين.يجب عليك إما الاتصال بـ new بدلاً من create
@version = @project.versions.new(version_params)
if @version.save
للتحقق مما إذا كان سجل جديد
@version = @project.versions.create(version_params)
unless @version.new_record?