2016-09-27 2 views
0

У меня есть form, который передает массив моему контроллеру в параметрах, и он продолжает вызывать ActiveModel::ForbiddenAttributesError. Моя функция create вызывает другую функцию для исправления этих параметров массива и объединения частей в строку, но я думаю, что слишком поздно в этот момент.Rails 4: Params with hash

Params

{ "remote"=> 
     { "name"=>"", 
     "start_date"=>"9/27/2016", 
     "email"=>"", 
     "allergies"=>["Peanuts", "Soy Protein", "Dairy", ""], 
     } 
} 

Контроллер

def create 

    new_params = fix_params(params, ["allergies"]) 
    remote_params = new_params["remote"] 
    @remote = Remote.new(remote_params) 

    respond_to do |format| 
     if @remote.save 
      format.html { redirect_to root_path, notice: 'Remote was successfully created.' } 
      format.json { render :show, status: :created, location: @remote } 
     else 
      format.html { render :new } 
      format.json { render json: @remote.errors, status: :unprocessable_entity } 
     end 
    end 
end 

def fix_params(params, fields) 
     fields.each do |field| 
      to_change = params[:remote][field] 
      new_param = to_change.join(", ").strip() 
      params[:remote][field] = new_param || "" 
     end 
    return params 
end 

Может быть, есть лучший способ передать эти переменные?

+1

'ActiveModel' ошибка будет предложить что-то в модели блокирует это. Не могли бы вы также опубликовать это? Кроме того, зачем вам нужен метод 'fix_params', чего вы пытаетесь достичь? Несомненно, это более жёсткий путь. – Matt

+0

Вы правы, это было из-за модели, и мне жаль, что я не мог по-другому выполнить то, что я делаю в 'fix_params'. Функция в основном принимает массив параметров и объединяет их в строку –

+0

. В вашей модели есть лучший способ сделать это: определить настраиваемую настройку def allergies = (значение) do self [: allergies] = value.is_a? (Array)? value.join (',') .strip: значение end. модель будет фиксировать значение в любое время, когда вы его установили. – arieljuod

ответ

0

Ошибка произошла из-за того, что было unpermitted parameters, потому что я никогда не указывал, что в параметрах будет array.

Я изменил мои сильные параметры включают params.require(:remote).permit(:name, :start_date, :email, :allergies => [])

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