Search code examples
ruby-on-railsstrong-parameters

Is it possible to chain strong parameters in a Rails controller


I'm currently doing this

class DetailsController < ApplicationController
  def create
    @detail = Detail.new(params.require(:detail).permit(:user_id, :note))
    if @detail.save
      redirect_to @detail
    else
      render 'new'
    end
  end
  
  def update
    @detail = Detail.find(params[:id])
    if @detail.update(detail_params)
      redirect_to @detail
    else
      render 'edit'
    end
  end
  
  private
  def detail_params
    params.require(:detail).permit(:note)
  end  
end

Is it possible too chain strong parameters in Rails? I tried doing this but it didn't work

class DetailsController < ApplicationController
  def create
    @detail = Detail.new(detail_params.permit(:user_id))
    if @detail.save
      redirect_to @detail
    else
      render 'new'
    end
  end
  
  def update
    @detail = Detail.find(params[:id])
    if @detail.update(detail_params)
      redirect_to @detail
    else
      render 'edit'
    end
  end
  
  private
  def detail_params
    params.require(:detail).permit(:note)
  end  
end

Solution

  • To DRY things up I have used the tap method and done something like this...

     def detail_params(is_create = false)
       params.require(:detail).permit(:note).tap do |p|
         p[:user_id] = current_user.id if is_create
       end
     end 
    
      def create
        @detail = Detail.new(detail_params(true))
        if @detail.save
          redirect_to @detail
        else
          render 'new'
        end
      end
    
    
      def update
        @detail = Detail.find(params[:id])
        if @detail.update(detail_params)
          redirect_to @detail
        else
          render 'edit'
        end
      end
    

    To just have different sets of parameters, this works...

     def detail_params(is_create = false)
       permitted = [:note]
       permitted << :user_id if is_create
       params.require(:detail).permit(permitted)
     end