ActionController :: ParameterMissing (falta param o el valor está vacío: película):

Por lo tanto, recibo el siguiente error al intentar visitar la página de películas en mi aplicación:

ActionController::ParameterMissing (param is missing or the value is empty: film): 2014-07-24T22:04:44.622356+00:00 app[web.1]: app/controllers/saas_admin/films_controller.rb:54:in `permitted_params' 

Ver el código de mi controlador de películas a continuación

films_controller.rb

 class SaasAdmin::FilmsController  :find_by_id!, :param => :studio_id, :class_name => Studio before_filter :set_sort_fields, :only => :edit before_filter :build_collections, :only => [:new, :create, :edit, :update] def create create! { parent_path(parent.id) } # Redirect to studio in case studio_id is changed end def update @film = Film.find_by_permalink(params[:id]) respond_to do |format| if @film.update(permitted_params) format.html { redirect_to saas_admin_studio_path(@film.studio), notice: 'Film was successfully updated.' } format.json { head :no_content } else format.html { render action: 'edit' } format.json { render json: @film.errors, status: :unprocessable_entity } end end end def index redirect_to parent_path(parent.id) end def show @clips = resource.clips.paginate(:page => params[:page], :per_page => 30, :order => 'clips.position') end protected def resource # @film ||= end_of_association_chain.find_by_permalink!(params[:id]) @film ||= end_of_association_chain.find_by_permalink!(params[:id]) end def collection @films ||= end_of_association_chain.paginate(:page => params[:page], :per_page => 30, :order => 'films.created_at') end def set_sort_fields resource.sort_name = '' if resource.name == resource.sort_name end def build_collections @studios ||= Studio.find(:all) end def permitted_params params.require(:film).permit(:name, :sort_name, :description, :short_description, :meta_data, :poster, :amazon_link, :active, :trackable, :country_ids => []) end end 

¿Qué podría ser esto? He estado tratando de resolverlo un poco, pero tal vez un nuevo par de ojos descubra que es algo bastante simple.

¡Aclamaciones!

Editar

Aquí está el código de vista para films / new.html.erb

 

collection_path, :html => { :multipart => true } do |f| -%> "form", :locals => { :f => f } %> "saas_admin/shared/sidebar" %>

y films / edit.html.erb

 

saas_admin_studio_film_path(parent, resource), :html => { :multipart => true } do |f| -%> "form", :locals => { :f => f } %> "saas_admin/shared/sidebar" %>

Editar 2

Para referencia aquí es cómo se definieron los parámetros permitidos cuando estaba funcionando:

  def permitted_params {:film => params.fetch(:film, {}).permit( :name, :sort_name, :description, :short_description, :meta_data, :poster, :amazon_link, :active, :trackable)} end 

Esto sucede porque ha especificado que se requiera ‘película’ en sus parámetros a través de strong_params (especificado anteriormente en su código de parámetros permitidos).

Lo que sea que esté haciendo la vista (ya sea un enlace o una forma / etc.), no está pasando sus parámetros nesteds bajo ‘película’

ej.) si raise params.inspect en la acción del controlador, vería que no hay ningún nodo para “película”.

Lo más probable es que lo que está mal es que el código de formulario que tiene en el lado de la vista no está configurado para anidar estos parámetros correctamente, ¿está utilizando un form_tag por ejemplo?

También tengo este problema cuando uso el formato Angular JS para enviar datos al backend de Rails 4. Cuando no llené nada en formato js angular, el error mostrará ActionController::ParameterMissing (param is missing or the value is empty:

Lo soluciono añadiendo params.fetch(:film, {}) el parámetro fuerte en:

 params.fetch(:film, {}).permit(:name, :sort_name, :description, :short_description, :meta_data, :poster, :amazon_link, :active, :trackable, :country_ids => []) 

Me refiero al ejemplo de código para evitar ActionController :: ParameterMissing (falta param o el valor está vacío: película)

Espero que esto ayude.

Por qué no usarlo así:

 def creation_params params.permit(:film) end 

¡Me funciona! 😉