2014-04-12 4 views
5

Ho cercato di impazzire per risolvere questo errore permit utilizzando alcuni degli altri post di StackOverflow, ma non riesco a superarlo. Ho un modello di progetto & controller & a versioni modello & controller. Projects/##/versions/new è una pagina modulo per creare una nuova versione dell'id del progetto ##. Ma quando si fa clic sul pulsante di invio per creare la versione ... getta il seguente errore nel VersionsController:metodo non definito `permesso 'per" Invia ora! ": String. Dove sto andando male?

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 

Qualsiasi aiuto sarebbe molto apprezzato ... Ho cercato di risolvere questo problema per troppo lungo ora Il mio codice è il seguente:

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' 

progetti modello:

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 

versioni del modello:

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

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

VERSIONI CONTROLLER:

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 (nuova forma di versione):

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

risposta

6

posso riconoscere il problema riguarda i params. Hai questa:

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

Si dovrebbe avere questo:

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

Il motivo per cui questo è un problema è perché non si dispone di un titolo di versione viene passata nelle params, e si sta cercando di creare una nuova versione con i parametri. Cerca invece la cosa più vicina che in questo caso sembra essere la stringa "Invia ora!", Ma poiché "inviare" non è consentito rispetto ai forti params lo butta fuori.

Sembra che si stia creando correttamente il modulo, potrebbe essere un problema con bootstrap_form_for. Puoi postare l'output di input per il titolo in html sul tuo modulo?

Nel frattempo ho due suggerimenti, prima cosa che può risolvere il problema, è quello di cambiare f.submit a f.button. f.button creerà comunque un pulsante di invio, ma consente di nominare il nome nel modo in cui si sta tentando di farlo.

Anche nel controller, non è necessario salvare dopo aver chiamato crea. crea lo memorizzerà effettivamente nel database, quindi lo salverai due volte. Si dovrebbe chiamare uno nuovo, invece di creare

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

di controllo se nuovo record

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

Tu sei l'uomo, JKFever. Ho cambiato il f.submit in f.pulsante e '.create' a '.new' come hai suggerito e questo ha fatto il trucco. Puoi spiegare un po 'di più perché f.submit ha causato un problema (ma f.button è ok)? Non ho capito bene dalla tua risposta precedente perché quel cambiamento ha aiutato a farlo funzionare. Grazie uomo – BB500

Problemi correlati