2015-10-25 5 views
1

Я реализующего метод search в контроллере, и я получаю эту ошибку:Получение ActiveModel :: ForbiddenAttributesError в контроллере

ActiveModel::ForbiddenAttributesError in TripsController#search 

Extracted source (around line #22): 

Нарушитель линия находится в следующем блоке:

if params[:search].present? 
    @trips = Trip.where("destination LIKE :destination", {:destination=> "%#{params[:search].first}%"}).where(@filters) 
else 
    @trips = (Trip.where(@filters)) rescue (Trip.where(@filters).paginate(:page => params[:page], :per_page => 10)) 
end 

Ниже приведен полный код метода:

def search 
    @languages = Trip.pluck(:language).uniq 
    @interests = Trip.pluck(:interests).uniq 
    @destinations = Trip.pluck(:destination).uniq 

    @filters = params.slice(:language,:interests) 
    @search_param = params[:search].first rescue nil 
    @language_param = params[:language] 
    @intersts_param = params[:interests] 

    if params[:search].present? 
     @trips = Trip.where("destination LIKE :destination", {:destination=> "%#{params[:search].first}%"}).where(@filters) 
    else 
     @trips = (Trip.where(@filters)) rescue (Trip.where(@filters).paginate(:page => params[:page], :per_page => 10)) 
    end 
    end 

ответ

0

Вы должны использовать Rails сильный Para метров. Даже если вы не используете параметры для создания модели, Rails вызовет исключение, если вы используете params.slice и передаете результат в запрос.

Это связано с довольно активным подходом к Rails 4, чтобы избежать уязвимостей при массовом назначении.

def search 
    @languages = Trip.pluck(:language).uniq 
    @interests = Trip.pluck(:interests).uniq 
    @destinations = Trip.pluck(:destination).uniq 
    @filters = params.permit(:language,:interests) 
    @search_param = params.permit(search: []) 
    @language_param = @filters[:language] 
    @intersts_param = @filters[:interests] 

    if params[:search].present? 
    # you don't need named placeholders for a single parameter... 
    @trips = Trip.where("destination LIKE ?", params[:search].first) 
       .where(@filters) 
    else 
    @trips = (Trip.where(@filters)) rescue (Trip.where(@filters).paginate(:page => params[:page], :per_page => 10)) 
    end 
end 

Однако в .where(@filters) вы нарушаете правило кардинальное и передачи пользовательского ввода прямо в запросе SQL.

Вместо этого вы должны использовать что-то вроде этого:

Trip.where(language: @filters[:language]) 

Это создаст "? ГДЕ trips.language =" запрос с заполнителем, который удаляет уязвимость SQL-инъекции.

+0

спасибо большое :) Я очень ценю вашу помощь –

Смежные вопросы