2014-04-12 1 views
5

Ich habe versucht, wie verrückt, durch diese permit Fehler mit einigen der anderen StackOverflow-Buchungen zu arbeiten, aber es scheint nicht vorbei zu kommen. Ich habe ein Projekt Modell & Controller & ein Versionen Modell & Controller. Projects/##/versions/new ist eine Formularseite zum Erstellen einer neuen Version der Projekt-ID ##. Aber wenn ich den Submit-Button klicken um die Version zu erstellen ... es führt den folgenden Fehler in den VersionsController:undefined Methode `erlauben 'für" Submit Now! ": String. Wo gehe ich falsch?

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 

Jedwedes Hilfe wäre sehr dankbar ... Ich habe versucht, dies zu beheben jetzt zu lang. Mein Code ist wie folgt:

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' 

PROJEKTE MODELL:

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 

AUSFÜHRUNGEN MODELL:

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

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

VERSIONEN REGLER:

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 (neue Version Form):

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

Antwort

6

ich das Problem in den params erkennen kann. Sie haben dies:

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

Der Grund, warum dies ein Problem ist, weil man in den params übergeben wird nicht eine Version Titel haben, und Sie versuchen, zu erstellen:

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

du haben sollte eine neue Version mit den Parametern. Stattdessen sucht es nach der nächsten Sache, die in diesem Fall die Zeichenfolge "Submit Now!" Ist, aber da "submit" nicht zulässig ist, werden sie von starken params verworfen.

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

In der Zwischenzeit habe ich zwei Vorschläge haben, Das erste, was das Problem lösen kann, ist f.submit zu f.button zu ändern. f.button wird weiterhin eine Senden-Schaltfläche erstellen, aber Sie können den Namen so eingeben, wie Sie es versuchen.

Auch in der Steuerung müssen Sie nicht speichern, nachdem Sie create erstellen. create speichert es tatsächlich in der Datenbank, so dass Sie es zweimal speichern. Sie sollten entweder neu rufen stattdessen

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

der Prüfung der erstellen, wenn neue Rekord

@version = @project.versions.create(version_params) 
unless @version.new_record? 
+0

Sie sind der Mann, JKFever. Ich habe fmit in f geändert.Taste und die '.create' zu '.new', wie Sie vorgeschlagen haben und das hat den Trick gemacht. Kannst du ein wenig mehr erklären, warum f.mit ein Problem verursacht hat (aber f.button ist in Ordnung)? Ich habe aus Ihrer vorherigen Antwort nicht ganz verstanden, warum diese Änderung geholfen hat. Danke, Mann – BB500

Verwandte Themen