طريقة "تصريح" غير محددة لـ "أرسل الآن!"":خيط.هل أنا على خطأ؟

StackOverflow https://stackoverflow.com//questions/23034953

سؤال

لقد كنت أحاول بجنون العمل من خلال هذا 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?
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top