2014-04-12 9 views
5

Próbowałem jak szalony, aby pracować przez ten błąd permit przy użyciu niektórych innych postów StackOverflow, ale nie wydaje się, aby przejść przez to. Posiadam sterownik modelu & model kontrolera wersji &. Projects/##/versions/new to strona formularza umożliwiająca utworzenie nowej wersji identyfikatora projektu ##. Ale po kliknięciu w przycisk by stworzyć wersję ... rzuca się następujący błąd w VersionsController:niezdefiniowana metoda "zezwalaj" na "Prześlij teraz!": Ciąg. Gdzie się mylę?

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 

Wszelka pomoc będzie bardzo mile widziane ... Próbowałem to naprawić za teraz zbyt długo. Mój kod wygląda następująco:

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' 

projektów modelowych:

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 

modelach:

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

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

WERSJE Kontroler:

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 (nowa forma wersja):

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

Odpowiedz

6

mogę rozpoznać problem w params. Trzeba to:

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

Trzeba to:

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

Powodem jest to problem jest, bo nie masz tytuł wersji były przekazywane w params, i staramy się tworzyć nowa wersja z parametrami. Zamiast tego szuka najbliższej rzeczy, która w tym przypadku jest łańcuchem "Prześlij teraz!", Ale ponieważ "wyślij" jest niedozwolone, niż silne paramy wyrzuca.

Wygląda na to, że poprawnie tworzysz swój formularz, może to być problem z bootstrap_form_for. Czy umieścisz w formularzu to, jak wygląda wejście wejściowe do tytułu w html?

W międzyczasie mam dwie propozycje, Pierwszą rzeczą, która może rozwiązać ten problem, jest zmiana f.submit do f.button. f.button nadal utworzy przycisk przesyłania, ale pozwala na nadanie nazwy tak, jak chcesz.

Również w kontrolerze nie trzeba zapisywać po utworzeniu połączenia. create będzie faktycznie przechowywać go w bazie danych, więc zapisujesz go dwukrotnie. Należy zadzwonić albo nowy zamiast tworzyć

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

sprawdzenia, czy nowy rekord

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

Jesteś człowiekiem, JKFever. Zmieniłem f.submit na f.i ".create" do ".new" zgodnie z sugestią i to się udało. Czy możesz wyjaśnić nieco więcej, dlaczego f.submit spowodował problem (ale f. Przycisk jest w porządku)? Nie do końca zrozumiałam z twojej poprzedniej odpowiedzi, dlaczego ta zmiana pomogła jej działać. Dzięki – BB500

Powiązane problemy