2014-12-18 3 views
1

У меня есть поиск по моей проблеме, но я не могу найти решение.Проверка не работает - параметр отсутствует или значение пуста несущей волны

Моя модель home с атрибутами, такими как: title, logo, description, keywords.

Я использую carrierwave + замедленное задание для закачать logo, загрузка работа (создание & обновления), но когда файл/входной файл пуст, я получил эту ошибку:

ActionController::ParameterMissing in SettingsController#home_update_b 
param is missing or the value is empty: home 

Extracted source (around line #99): 

    def home_update_b_params 
     params.require(:home).permit(:logo) 
    end 
end 

SettingsController

def index 
## get one record without params 
@home = Home.take 
end 

def home_update_b 
    @home = Home.find(params[:id]) 
    if @home.update(home_update_b_params) 
    respond_to do |format| 
     format.html { redirect_to setting_home_path, :notice => "Logo successfully updated" } 
     format.json { head :no_content } 
     end 
    else 
    respond_to do |format| 
     format.html { 
      flash[:alert] = "There's Something Wrong" 
      render :action => :home 
     } 
     format.json { render json: @home.errors, status: :unprocessable_entity } 
    end 
    end 
end 

private 

def home_update_b_params 
params.require(:home).permit(:logo) 
end 

Я уверен, что на home модели имеют проверки

class Home < ActiveRecord::Base 
    mount_uploader :logo, LogoUploader 
    after_save :enqueue 

    validates_presence_of :logo 
end 

форма

<%= form_for(@home, :url => logo_update_path(@home), :html => { :class => "form-horizontal", :role => "form", :method => :put}) do |f| %> 
    <div class="form-group"> 
    <%= f.label :logo, "Logo", :class => 'col-sm-3 control-label no-padding-right ace-file-input' %> 
    <div class="col-sm-4"> 
      <%= f.file_field :logo, "data-file-input" => "easy" %> 
    </div> 
    </div> 
    <div class="clearfix form-actions"> 
    <div class="col-md-offset-3 col-md-9"> 
     <%= f.submit %> 
    </div> 
    </div> 
<% end %> 

трассировки стека

Processing by SettingsController#home_update_b as HTML 
    Parameters: {"utf8"=>"V", "authenticity_token"=>"gmXtbe31vfSPqM1N5taM1ge92nRvr 
SpY91Y8vAlEBmc=", "commit"=>"Update Home", "id"=>"2"} 
    ←[1m←[36mHome Load (0.0ms)←[0m ←[1mSELECT "homes".* FROM "homes" WHERE "hom 
es"."id" = $1 LIMIT 1←[0m [["id", 2]] 
Completed 400 Bad Request in 4ms 

ActionController::ParameterMissing (param is missing or the value is empty: home 
): 
    app/controllers/settings_controller.rb:99:in `home_update_b_params' 
    app/controllers/settings_controller.rb:60:in `home_update_b' 

Когда я добавить еще один атрибут для формирования (например, title), входной файл по-прежнему пуст, и это работает для обновления, но проверка не работает для входного файла пуст ,

FYI Rails 4.1.1 и 1.9.3 рубин

+0

Почему вы используете 'button_tag' вместо' f.submit' или 'f.button'? –

+0

Могу ли я использовать значок ('' tag) с 'f.submit'? Я думаю, что нет причин для моей проблемы, потому что я использую это для новой формы, и это работает. Также используйте по-прежнему ошибку 'f.button'. – itx

+0

Вы можете с 'f.button', как я написал в своем ответе. –

ответ

10

Если вы принимаете какие-либо тип файла от пользователя, используя тип входного «файл» и пользователь не выбирает, вы не будете получите ключ для этого поля в хэш-параметре.

В вашем случае, вы принимаете только логотип от пользователя, и если он пуст, то дом ключ не существует в вашем параметре хэш, таким образом, метод require() бросает исключение, потому что он не нашел указанный ключ.

Вместо require() вы можете использовать метод fetch(), который может возвращать пустой хеш в качестве значения по умолчанию, если указанный ключ не найден. Например:

params.fetch(:home, {}).permit(:logo) 
+0

спасибо. я спас свое время. –

+0

Спасибо, я просто столкнулся с той же проблемой. – Tintin81

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