2015-05-24 2 views
0

Я получаю эту ошибку: param is missing or the value is empty: character. Я сбит с толку. Должна быть проблема с form_for где-то, но я просто не могу ее найти. Я обновляю Character атрибутов в контроллере Users, но это не важно, я думаю?Rails настраиваемый маршрут form_for error: param отсутствует или значение пуст

Параметры:

{"utf8"=>"✓", 
"_method"=>"patch", 
"authenticity_token"=>"...", 
"picturethings"=>{"picture"=>[#<ActionDispatch::Http::UploadedFile:0x000001100087f8 @tempfile=#<Tempfile:/var/folders/19/_vdcl1r913g6fzvk1l56x4km0000gn/T/RackMultipart20150524-4855-1eieu5j.jpeg>, 
@original_filename="GOT1.jpeg", 
@content_type="image/jpeg", 
@headers="Content-Disposition: form-data; name=\"picturethings[picture][]\"; filename=\"GOT1.jpeg\"\r\nContent-Type: image/jpeg\r\n">]}, 
"commit"=>"Upload pictures", 
"callsign"=>"bazzer"} 

просмотров/пользователей/edit.html.erb

<%= form_for @character, url: update_pictures_user_path do |f| %> 
    <%= f.fields_for :picturethings, html: { multipart: true } do |p| %> 
    <%= p.label :picture %> 
    <%= p.file_field :picture, multiple: true, name: "picturethings[picture][]" %> 
    <% end %> 
    <%= f.submit "Upload pictures" %> 
<% end %> 

users_controller.rb

def edit 
    @character = Character.find_by(callsign: params[:callsign]) 
    @user = @character.sociable 
    @picturething = @character.picturethings.build 
end 

def update_pictures 
    @character = Character.find_by(callsign: params[:callsign]) 
    if @character.update_attributes(update_pictures_user_params) 
    flash[:success] = "Pictures updated" 
    params[:picturethings]['picture'].each do |p| 
     @picturething = @character.picturethings.create!(picture: p, character_id: @character.id) 
    end 
    render 'edit' 
    else 
    render 'edit' 
    end 
end 

def update_pictures_user_params 
    params.require(:character).permit(picturethings_attributes: [:picture]) 
end 

character.rb

belongs_to :sociable, polymorphic: true 
has_many :picturethings 
accepts_nested_attributes_for :picturethings 

user.rb

has_one :character, as: :sociable, dependent: :destroy 

routes.rb

patch '/users/:callsign/update_pictures', to: 'users#update_pictures', as: :update_pictures_user 

ответ

0

Ваше имя входного файла неправилен. Если вы посмотрите на данные формы:

form-data; name=\"picturethings[picture][]\"; filename=\"GOT1.jpeg\"\r\nContent-Type: image/jpeg\r\n" 

Нет character param.

Правильное имя атрибута будет выглядеть примерно так:

character[picturethings_attributes][1][picture][] 

Когда Rails обрабатывает данные формы он преобразует его в следующий хэш:

character: { 
    picturethings_attributes: { 
    0 => { 
     picture : [] # an array of files. 
    } 
    } 
} 

Вам не нужно указать имя вручную:

<%= form_for @character, url: update_pictures_user_path do |f| %> 
    <%= f.fields_for :picturethings, html: { multipart: true } do |p| %> 
    <%= p.label :picture %> 
    <%= p.file_field :picture, multiple: true %> 
    <% end %> 
    <%= f.submit "Upload pictures" %> 
<% end %> 

Rails предоставит вам правильный атрибут имени. Вам также не нужно вручную создавать связанные записи - это весь смысл accepts_nested_attributes_for:

def update_pictures 
    @character = Character.find_by(callsign: params[:callsign]) 
    if @character.update_attributes(update_pictures_user_params) 
    flash[:success] = "Pictures updated" 
    render 'edit' 
    else 
    render 'edit' 
    end 
end 
+0

Спасибо papirtiger, я сделал изменения вы предложили, и теперь у меня есть параметр персонажа. Однако она создала новую проблему: каждый раз, когда файл загружается, а страница редактирования обновляется, появляется больше '.field' div, поэтому на странице теперь находится около 100' p.file_field'. Я не могу избавиться от них. Кажется, что у персонажа 100 картин. Но только некоторые из них имеют соответствующие 'pictures' (я добавил' <% @ character.picturethings.each do | picturething |%> <% = image_tag picturething.picture%> 'для отображения изображений). Возможно, мне придется начать новый вопрос. – Bazley

+0

Запустите новый вопрос. – max

+0

[Готово] (http://stackoverflow.com/questions/30445740/rails-unwanted-instances-appearing-in-view-and-being-saved-to-the-database) – Bazley

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