Pregunta

He estado tratando como un loco para trabajar a través de este permit error en la utilización de algunos de los otros StackOverflow mensajes, pero parece que no puede conseguir más allá de ella.Tengo proyectos modelo y controlador y una de las versiones del modelo y controlador. Projects/##/versions/new es una página de formulario para crear una nueva versión de project id ##.Pero cuando hago clic en el botón enviar para crear la versión...se tira el siguiente error en el 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

Cualquier ayuda sería muy apreciada...he estado tratando de arreglar esto por demasiado tiempo.Mi Código es el siguiente:

Las RUTAS.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'

PROYECTOS MODELO:

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

VERSIONES DEL MODELO:

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

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

VERSIONES DE CONTROLADOR:

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

NUEVO.HTML.ERB (nueva versión del formulario):

<% 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'
¿Fue útil?

Solución

Puedo reconocer el problema en los parámetros.Tienes este:

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

Usted debe tener esto:

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

La razón de esto es un problema es porque no tiene una versión del título que se pasa en la params, y usted está tratando de crear una nueva versión con los parámetros.Que en su lugar se ve de lo más cercano, que en este caso pasa a ser la cadena "Enviar Ahora!", pero desde "enviar" no está permitido que fuerte params la arroja fuera.

Parece que va a crear el formulario correctamente, puede ser un problema con bootstrap_form_for.Puedes publicar lo que la entrada y salida para el título se parece en html en el formulario?

Mientras tanto tengo dos sugerencias, La primera cosa que puede resolver el problema, es cambiar f.enviar a f.botón.f.botón crear un botón de enviar, pero permite que usted nombre está en la forma en que usted está tratando.

También en el controlador, no es necesario guardar después de llamar a crear.cree realmente almacenan en la base de datos, por lo que se ahorra dos veces.Debe llamar nuevo en lugar de crear

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

de comprobar si el nuevo registro

@version = @project.versions.create(version_params)
unless @version.new_record?
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top