Pergunta

Eu tenho tentado como um louco resolver isso permit erro ao usar algumas das outras postagens do StackOverflow, mas parece que não consigo superá-lo.Eu tenho um modelo e controlador de projetos e um modelo e controlador de versões. Projects/##/versions/new é uma página de formulário para criar uma nova versão do ID do projeto ##.Mas quando clico no botão enviar para criar a versão... ocorre o seguinte erro no 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

Toda e qualquer ajuda seria muito apreciada... Estou tentando consertar isso há muito tempo.Meu código é o seguinte:

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

MODELO DE PROJETOS:

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

MODELO DE VERSÕES:

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

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

CONTROLADOR DE VERSÕES:

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 (formato de nova versão):

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

PARÂMETROS:

{"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'
Foi útil?

Solução

Posso reconhecer o problema nos parâmetros.Você tem isto:

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

Você deveria ter isto:

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

A razão pela qual isso é um problema é porque você não tem um título de versão sendo passado nos parâmetros e está tentando criar uma nova versão com os parâmetros.Em vez disso, ele procura a coisa mais próxima que, neste caso, é a string "Enviar agora!", mas como "enviar" não é permitido, parâmetros fortes o descartam.

Parece que você está criando seu formulário corretamente, pode ser um problema com bootstrap_form_for.Você pode postar como é a saída de entrada do título em HTML no seu formulário?

Enquanto isso, tenho duas sugestões, a primeira coisa que pode resolver o problema é mudar f.enviar para botão f..f.button ainda criará um botão de envio, mas permitirá que você nomeie da maneira que você está tentando.

Também no controlador, você não precisa salvar depois de chamar create.create irá, na verdade, armazená-lo no banco de dados, então você o salvará duas vezes.Você deve chamar new em vez de create

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

de verificar se há novo registro

@version = @project.versions.create(version_params)
unless @version.new_record?
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top