2015-06-01 4 views
1

Я создаю форму, которая запускает новую кампанию. С помощью этой кампании вы можете выбрать Zip-файл и/или некоторые файлы PDF. Файлы Zip и PDF хранятся в таблице Uploads.Rails 4: collection_check_box error

До сих пор, кажется, я могу выбрать Zip-файл, однако, как только я добавляю collection_check_box для PDF-файлов, создать кампанию, я получаю следующее сообщение об ошибке ...

expected Array (got String) for param `upload_ids' 

Моя форма выглядит следующим образом ..

<%= form_for @campaign, url: {action: "create"} do |f| %> 
    <%= f.label :name, class: "right-label" %> 
    <%= f.text_field :name %> 

    <%= f.label :comment, "Comments" %> 
    <%= f.text_area :comment %> 


    <%= f.label :zip_file, class: "right-label" %> 

    <%= f.collection_select :upload_ids, Upload.where(file_type: ".zip"), :id, :file_name, include_blank: "Include a Zip File" do |b| %> 
     <%= b.option + File.basename(b.text, '.*') %> 
    <% end %> 

    <%= f.label :pdf_files %> 

<ul><%= f.collection_check_boxes :upload_ids, Upload.where(file_type: ".pdf"), :id, :file_name do |b| %> 
    <li><%= b.label do %> 
     <%= b.check_box + File.basename(b.text,'.*') %> 
    </li> 
     <% end %> 
    <% end %> 
</ul> 

Ниже приведена ошибка, отображаемая на сервере в соответствии с запросом.

[2015-06-01 14:50:57] ERROR Rack::Utils::ParameterTypeError: expected Array (got String) for param `upload_ids' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/utils.rb:142:in `normalize_params' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/utils.rb:156:in `normalize_params' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/utils.rb:117:in `block in parse_nested_query' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/utils.rb:114:in `each' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/utils.rb:114:in `parse_nested_query' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/request.rb:369:in `parse_query' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/request.rb:215:in `POST' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/methodoverride.rb:39:in `method_override_param' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/methodoverride.rb:27:in `method_override' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/methodoverride.rb:15:in `call' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/runtime.rb:18:in `call' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/activesupport-4.2.1/lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/lock.rb:17:in `call' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/actionpack-4.2.1/lib/action_dispatch/middleware/static.rb:113:in `call' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/sendfile.rb:113:in `call' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/railties-4.2.1/lib/rails/engine.rb:518:in `call' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/railties-4.2.1/lib/rails/application.rb:164:in `call' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/lock.rb:17:in `call' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/content_length.rb:15:in `call' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/handler/webrick.rb:89:in `service' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/2.2.0/webrick/httpserver.rb:138:in `service' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/2.2.0/webrick/httpserver.rb:94:in `run' 
    /Users/Josh/.rbenv/versions/2.2.2/lib/ruby/2.2.0/webrick/server.rb:294:in `block in start_thread' 

EDIT

Если удалить один из блоков сбора (ZIP или PDF), мое создание кампании успешно.

Похоже, что существует конфликт с моими «upload_ids» как в Zip-файле, так и в методах выбора PDF-файлов выше. Несмотря на то, что моя модельная связь заявляет, что Кампания has_many: uploads, through: uploadable и has_many: uploadable, она пытается принять как Zip, так и PDF/s - один экземпляр upload_id.

Я все еще не уверен, как обойти это. Любая помощь приветствуется.

Контроллеры/campaigns_controller.rb

class CampaignsController < ApplicationController 
     def index 
     @campaigns = Campaign.all.order("created_at DESC") 
     end 

     def new 
     @campaign = Campaign.new 
     end 

     def create 
     @campaign = Campaign.new(campaign_params) 

     if @campaign.save 
      flash[:success] = "Campaign Successfully Launched!" 
      redirect_to @campaign 
     else 
      flash[:error] = "There was a problem launching your Campaign." 
      redirect_to new_campaign_path 
     end 
     end 

     def show 
     @campaign = Campaign.find(params[:id]) 
     end 

    private 

     def campaign_params 
     params.require(:campaign).permit(:name, :comment) 
     end 
end 

журнал/development.log

Started GET "/campaigns/new" for ::1 at 2015-06-01 18:54:19 -0700 
Processing by CampaignsController#new as HTML 
    [1m[35mUpload Load (0.2ms)[0m SELECT "uploads".* FROM "uploads" 
    [1m[36mUpload Load (0.3ms)[0m [1mSELECT "uploads".* FROM "uploads" WHERE "uploads"."file_type" = $1[0m [["file_type", ".zip"]] 
    [1m[35mUpload Load (0.1ms)[0m SELECT "uploads".* FROM "uploads" WHERE "uploads"."file_type" = $1 [["file_type", ".pdf"]] 
    Rendered campaigns/_form.html.erb (6.6ms) 
    Rendered campaigns/new.html.erb within layouts/application (7.5ms) 
    Rendered layouts/_header.html.erb (0.2ms) 
    Rendered layouts/_footer.html.erb (0.0ms) 
Completed 200 OK in 82ms (Views: 80.4ms | ActiveRecord: 0.5ms) 

Update # 1

Другой друг Разработчик отметил, что я не могу использовать " upload_ids "для обоих collection_selects. Это также очевидно в моих экспериментах выше. Итак, как мне разрешить пользователю связывать объект с двумя другими объектами из отдельной модели/таблицы?

Я изменил один параметр collection_select, чтобы быть uploadable_ids, но это случайное имя, которое я разместил. Я не знаю, как поставить этот параметр. Теперь я получаю вспышки [: ошибка] "There was a problem launching your Campaign."

Update # 2

Я пробовал много предложений, в том числе те, на этой публикации, но до сих пор изо всех сил, чтобы получить эту работу. select_tag throws и undefined method, так что пока я просто использую select. Я попробовал добавить upload_ids[], но у вас была ошибка, которая должна была содержать больше аргументов.

Я также смущен тем, нужно ли мне что-либо добавлять к моему контроллеру. Могут ли ассоциации Active Record быть достаточными, когда я решаю, к какому из кампаний привязаны какие файлы?

Здесь представлена ​​форма zip и pdf формы в текущем состоянии.

<%= f.label :data_file, class: "right-label" %> 

<%= f.select :upload_ids, 
    options_from_collection_for_select(
    Upload.where(file_type: ".zip"), :id, :file_name), 
    {include_blank: "Include a Zip File"}, {mulitple: true} %> 

<%= f.label :additional_files %> 

<%= f.collection_check_boxes(:upload_ids, 
    Upload.where(file_type: ".pdf"), :id, :file_name, 
    { mulitple: true }) do |b| %> 
      <%= b.label do %> 
       <%= b.check_box + File.basename(b.text,'.*') %> 
      <% end %> 
<% end %> 

Если какая-либо добавленная помощи, то здесь модель отношений:

class Campaign < ActiveRecord::Base 
    has_many has_many :uploadable 
    has_many :uploads, through: :uploadable 
end 

class Uploadable < ActiveRecord::Base 
    belongs_to :campaign 
    belongs_to :upload 
end 

class Upload < ActiveRecord::Base 
    has_many :uploadable 
    has_many :campaigns, through: :uploadable 
end 
+0

показать полный стек ошибок. Улучшенные журналы разработки с консоли –

+0

@R_O_R - Добавлен вывод консоли выше. – shroy

+0

@R_O_R - Обновлен пост с недавним открытием. – shroy

ответ

1

Основной вопрос, который я вижу, что ваши флажки подают параметр массива (можно выбрать несколько флажков), но ваш collection_select пытается представить исключительное значение. Смешивание двух является тем, что вызывает Rack :: Utils :: ParameterTypeError

Ваша ассоциация uploads является has_many, поэтому использование параметра массива - это правильная вещь. Самое простое, что вы можете сделать, это сделать выбор из нескольких вариантов, добавив опцию multiple: true. Обратите внимание, что это должно идти в отдельном хэше к вашему include_blank.

Чтобы сохранить отдельный выбор, я думаю, вам нужно будет спуститься до вызова select_tag и указать upload_ids[] в качестве имени ввода. Вы можете использовать options_from_collection_for_select для генерации тегов параметров.

+0

Это определенно ведет меня в правильном направлении. Спасибо. К сожалению, я все еще сталкиваюсь с ошибками. Когда я указываю 'upload_ids []' как вход, мне говорят, что существует неправильное количество аргументов 0 для 1..3. При использовании select_tag я получаю ошибку 'undefined method 'select_tag'. Я чувствую, что проблема заключается также в том, как я использую 'upload_ids' на обоих блоках, но я не уверен, что еще положить. Оба блока наследуют одну и ту же таблицу «Загрузить». – shroy

+0

Множество видов использования upload_ids не является проблемой. Трудно сказать больше, не видя, что вы пытались изменить. –

+0

Я добавил сообщение с текущим кодом вместе с ассоциациями моделей. – shroy

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