ActionController::ParameterMissing (param is missing or the value is empty: film):

ruby-on-rails, ruby-on-rails-4

Solution

This is happening because you have specified to require 'film' in your parameters through strong_params (specified above in your permitted_params code).

Whatever the view side is doing (whether its a link or a form/etc.), its not passing its parameters nested under 'film'

eg.) if you were to `raise params.inspect` in the controller action, you would see that there is no node for "film".

Most likely what is wrong is that the form code you have on the view side is not set to nest these parameters properly, are you using a `form_tag` for example?

Problem

So, I'm getting the following error when trying to visit the films page on my app: ``` 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' ``` See my films controller code below films_controller.rb ``` class SaasAdmin::FilmsController < SaasAdminController inherit_resources belongs_to :studio, :finder => :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 ``` What might this be? I've been trying to figure it out for a bit but perhaps a fresh set of eyes will find it's something rather simple. Cheers! Edit Here's the view code for films/new.html.erb ``` <h1><%= @page_title = "New #{resource_class}" %></h1> <%= form_for resource, :url => collection_path, :html => { :multipart => true } do |f| -%> <%= render :partial => "form", :locals => { :f => f } %> <% end -%> <% content_for :sidebar do %> <%= render :partial => "saas_admin/shared/sidebar" %> <% end %> ``` and films/edit.html.erb ``` <h1><%= @page_title = "Edit #{resource_class}" %></h1> <%= form_for resource, :url => saas_admin_studio_film_path(parent, resource), :html => { :multipart => true } do |f| -%> <%= render :partial => "form", :locals => { :f => f } %> <% end -%> <% content_for :sidebar do %> <%= render :partial => "saas_admin/shared/sidebar" %> <% end %> ``` Edit 2 For reference here is how the permitted params was defined when it was working: ``` def permitted_params {:film => params.fetch(:film, {}).permit( :name, :sort_name, :description, :short_description, :meta_data, :poster, :amazon_link, :active, :trackable)} end ```

Original source