Frage

Ich habe wie verrückt versucht, das durchzustehen permit Bei der Verwendung einiger anderer StackOverflow-Beiträge ist ein Fehler aufgetreten, der jedoch scheinbar nicht behoben werden kann.Ich habe ein Projektmodell und einen Controller sowie ein Versionsmodell und einen Controller. Projects/##/versions/new ist eine Formularseite zum Erstellen einer neuen Version der Projekt-ID ##.Aber wenn ich auf die Schaltfläche „Senden“ klicke, um die Version zu erstellen, wird der folgende Fehler angezeigt 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

Für jede Hilfe wäre ich sehr dankbar ... Ich versuche schon zu lange, das Problem zu beheben.Mein Code lautet wie folgt:

ROUTEN.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'

PROJEKTMODELL:

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

VERSIONEN MODELL:

class Version < ActiveRecord::Base
  belongs_to :project
  validates :title, presence: true, length: { maximum: 140 }

  default_scope -> { order('created_at DESC') }
end

VERSIONSCONTROLLER:

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 (neues Versionsformular):

<% 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>

PARAMETER:

{"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'
War es hilfreich?

Lösung

Ich kann das Problem in den Parametern erkennen.Du hast das:

{"utf8"=>"✓",
 "authenticity_token"=>"######AAAA",
 "submit"=>"Submit Now! ",
 "project_id"=>"51"}

Das sollten Sie haben:

{"utf8"=>"✓",
 "authenticity_token"=>"######AAAA",
 "project_id"=>"51",
 "version"=>{"title"=>"Foo Bar"},
"button"=>""}

Der Grund für dieses Problem liegt darin, dass in den Parametern kein Versionstitel übergeben wird und Sie versuchen, mit den Parametern eine neue Version zu erstellen.Stattdessen wird nach dem nächstgelegenen Objekt gesucht, das in diesem Fall zufällig die Zeichenfolge „Jetzt senden!“ ist. Da „Submit“ jedoch nicht zulässig ist, wird es von Strong Params verworfen.

Es sieht so aus, als ob Sie Ihr Formular korrekt erstellen. Möglicherweise liegt ein Problem mit bootstrap_form_for vor.Können Sie in Ihrem Formular posten, wie die Eingabe-Ausgabe für den Titel in HTML aussieht?

In der Zwischenzeit habe ich zwei Vorschläge, als erstes, das das Problem lösen kann, ist es, sich zu ändern f.einreichen Zu f.Taste.f.button erstellt weiterhin eine Senden-Schaltfläche, Sie können diese jedoch so benennen, wie Sie es versuchen.

Auch im Controller müssen Sie nach dem Aufruf von create nicht speichern.create speichert es tatsächlich in der Datenbank, Sie speichern es also zweimal.Sie sollten entweder new statt create aufrufen

@version = @project.versions.new(version_params)
if @version.save

Überprüfen Sie, ob ein neuer Datensatz vorhanden ist

@version = @project.versions.create(version_params)
unless @version.new_record?
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top