2016-11-26 2 views
0

Мне нужно создать список тегов select, которые входят в таблицу соединений. Я создал эту петлюПроблема с созданием тега select с помощью цикла

- @game_details.fighting_game_main_characters.each do |main_character| 
    = simple_fields_for :combo_book_combo_works do |works| 
    = main_character.name 
    = works.input :fighting_game_main_character_id, as: :hidden, 
     input_html: {value: main_character.id} 
    = works.select :test, ["Works", "Doesn't Work", "Untested"], {}, 
     selected: "Untested", class: "form-control" 

Добавить это как ожидается. Когда я нахожу подачу. Доза не записывается в таблицу соединений. Я посмотрел на журнал и увидел, что только последний выберите тег был в представленных Params

Parameters: 
{ 
    "utf8"=>"✓", 
    "combo_book_combo"=>{ 
    "combo_book_combo_characters_attributes"=> 
     {"0"=>{"fighting_game_main_character_id"=>"1"} 
    }, 
    "combo_type"=>"Combo", 
    "character_positions"=>"Ground to Ground", 
    "screen_position"=>"Midscreen", 
    "combo"=>"ô" 
    }, 
    "keyboard-select"=>"", 
    "combo_book_combo_works"=>{ 
     "fighting_game_main_character_id"=>"13", 
     "test"=>"Works"}, 
    "commit"=>"Add combo" 
} 

Я смотрит источник страницы и увидел, что все избранных имели одинаковый идентификатор, поэтому я добавил

id: "combo_book_combo_works_#{main_character.id}" 

Но это не решает проблему, поскольку она до сих пор не писал в таблице присоединиться, так что я посмотрел на модели

class ComboBookCombo < ApplicationRecord 

    has_many :combo_book_combo_characters 
    has_many :fighting_game_main_characters, through: :combo_book_combo_characters 

    has_many :combo_book_combo_assists 
    has_many :fighting_game_assist_characters, through: :combo_book_combo_assists 

    has_many :combo_book_combo_character_extras 
    has_many :fighting_game_main_character_extras, through: :combo_book_combo_character_extras 

    has_many :combo_book_combo_works 
    has_many :fighting_game_main_characters, through: :combo_book_combo_works 

    has_many :combo_book_combo_extras 
    has_many :fighting_game_extras, through: :combo_book_combo_extras 

    validates :combo, :combo_type, :character_positions, :screen_position, presence: true 

    accepts_nested_attributes_for :combo_book_combo_characters, reject_if: proc { |attributes| attributes['fighting_game_main_character_id'].blank? }, allow_destroy: true 

    accepts_nested_attributes_for :combo_book_combo_assists, reject_if: proc { |attributes| attributes['fighting_game_assist_character_id'].blank? }, allow_destroy: true 

    accepts_nested_attributes_for :combo_book_combo_character_extras, reject_if: proc { |attributes| attributes['fighting_game_charater_extra_id'].blank? }, allow_destroy: true 

    accepts_nested_attributes_for :combo_book_combo_extras, reject_if: proc { |attributes| attributes['fighting_game_extra_id'].blank? }, allow_destroy: true 

    accepts_nested_attributes_for :combo_book_combo_works, reject_if: proc { |attributes| attributes['fighting_game_main_charater_id'].blank? }, allow_destroy: true 

    belongs_to :combo_book_user 
end 

class ComboBookComboWork < ApplicationRecord 
    belongs_to :combo_book_combo, optional: true 
    belongs_to :fighting_game_main_character 
end 


class FightingGameMainCharacter < ApplicationRecord 
    belongs_to :fighting_game 

    has_many :fighting_game_main_character_extras 

    has_many :combo_book_combo_characters 
    has_many :combo_book_combos, through: :combo_book_combo_characters 

    has_many :combo_book_combo_works 
    has_many :combo_book_combos, through: :combo_book_combo_works 

end 

, а затем контроллер

def create 
    @combo_book_combo = current_combo_book_user.combo_book_combos.build(combo_book_combo_params) 
    if @combo_book_combo.save 
     render 'index', notice: "Successfully created combo" 
    else 
     render 'index', notice: "Error creating combo" 
    end 
end 

и необходимые PARAMS

def combo_book_combo_params 
    params.require(:combo_book_combo).permit(
    :fighting_game_main_character_id, 
    :combo, 
    :combo_type, 
    :character_positions, 
    :combo_type, 
    :screen_position, 
    combo_book_combo_assists_attributes: [:id, :fighting_game_assist_character_id, :combo_book_combo_id, :_destroy], 
    combo_book_combo_character_extras_attributes: [:id, :combo_book_combo_id, :fighting_game_id, :_destroy], 
    combo_book_combo_extras_attributes:[:id, :combo_book_combo_id, :fighting_game_extra_id, :_destroy], 
    combo_book_combo_characters_attributes:[:id, :fighting_game_main_character_id, :combo_book_combo_id, :_destroy], 
    combo_book_combo_works_attributes:[:id, :combo_book_combo_id, :fighting_game_main_character_id, :test] 
) 
end 

и все, кажется, хорошо с ними, но, когда я представляю снова я получить

ComboBookUser Load (0.5ms) SELECT "combo_book_users".* FROM "combo_book_users" WHERE "combo_book_users"."id" = $1 ORDER BY "combo_book_users"."id" ASC LIMIT $2 [["id", 2], ["LIMIT", 1]] 
    (0.1ms) BEGIN 
    SQL (0.6ms) INSERT INTO "combo_book_combos" ("combo", "combo_type", "character_positions", "screen_position", "created_at", "updated_at", "combo_book_user_id") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id" [["combo", "ô"], ["combo_type", "Combo"], ["character_positions", "Ground to Ground"], ["screen_position", "Midscreen"], ["created_at", 2016-11-26 19:48:19 UTC], ["updated_at", 2016-11-26 19:48:19 UTC], ["combo_book_user_id", "2"]] 
    SQL (0.4ms) INSERT INTO "combo_book_combo_characters" ("combo_book_combo_id", "fighting_game_main_character_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["combo_book_combo_id", 52], ["fighting_game_main_character_id", 1], ["created_at", 2016-11-26 19:48:19 UTC], ["updated_at", 2016-11-26 19:48:19 UTC]] 
    (2.3ms) COMMIT 
    Rendering combo_book_combos/index.html.haml within layouts/application 
    Rendered combo_book_combos/index.html.haml within layouts/application (1.6ms) 
Completed 200 OK in 76ms (Views: 61.7ms | ActiveRecord: 4.0ms) 

Джойн, которые должны быть записаны не показывать вверх. Что мне нужно сделать, чтобы все теги выбора, сгенерированные циклом, записывались в таблицу соединений?

+0

Похоже, что параметры '' combo_book_combo_works '' не вложены как часть параметров '' combo_book_combo''. Вам нужно будет переработать код формы, чтобы атрибуты работ передавались вместе как часть одного и того же хэша в качестве параметров combo_book_combo. – guiniveretoo

+0

Я добавил параметры combo_book_combo. Как вы думаете, я должен переделать свою форму? – chun

ответ

0

Ваш контроллер ожидает, что все параметры будут переданы как вложенные значения под значением combo_book_combo. Именно этот метод пытается сделать:

def combo_book_combo_params 
    params.require(:combo_book_combo).permit(
    :fighting_game_main_character_id, 
    :combo, :combo_type, 
    :character_positions, 
    :combo_type, 
    :screen_position, 
    combo_book_combo_assists_attributes: [ 
     :id, 
     :fighting_game_assist_character_id, 
     :combo_book_combo_id, 
     :_destroy], 
    combo_book_combo_character_extras_attributes: [ 
     :id, 
     :combo_book_combo_id, 
     :fighting_game_id, 
     :_destroy], 
    combo_book_combo_extras_attributes:[ 
     :id, 
     :combo_book_combo_id, 
     :fighting_game_extra_id, 
     :_destroy], 
    # etc 
    ) 
end 

Это то, что ваши параметры в настоящее время выглядит следующим образом:

{ 
    "combo_book_combo"=>{ 
     "combo_book_combo_characters_attributes"=>{ 
      "0"=>{"fighting_game_main_character_id"=>"1"} 
     }, 
     "combo_type"=>"Combo", 
     "character_positions"=>"Ground to Ground", 
     "screen_position"=>"Midscreen", 
     "combo"=>"ô" 
    }, 
    "combo_book_combo_works"=>{ 
     "fighting_game_main_character_id"=>"13", 
     "test"=>"Works" 
    }, 
} 

Это то, что ваш контроллер ожидает ваши параметры выглядеть следующим образом:

{ 
    "combo_book_combo"=>{ 
     "combo_book_combo_characters_attributes"=>{ 
      "0"=>{"fighting_game_main_character_id"=>"1"} 
     }, 
     "combo_type"=>"Combo", 
     "character_positions"=>"Ground to Ground", 
     "screen_position"=>"Midscreen", 
     "combo"=>"ô", 
     "combo_book_combo_works_attributes"=>{ 
      "fighting_game_main_character_id"=>"13", 
      "test"=>"Works" 
     }, 
    }, 
} 

Обратите внимание, что combo_book_combo_works переместили внутриcombo_book_combo параметров, и изменился на combo_book_combo_works_attributes.

Посмотрите на свою форму прямо сейчас, особенно бит для combo_book_combo_characters_attributes. Похоже, что эта часть формы была правильно построена с вложенными атрибутами формы. Вероятно, вы измените simple_fields_for так, что это метод, вызываемый в родительской форме (что-то вроде f.simple_fields_for), а не как вызов метода вспомогательного метода просмотра.

+0

Я добавил '= f.simple_fields_for: combo_book_combo_works do | works |', но теперь все имена и теги выбора исчезли, и когда я смотрю источник, там тоже нет. – chun

+0

имеет ли объект «комбо-комбо» какие-либо «работы» инициализированы или сохранены?Simple_fields_for будет проходить через любые существующие объекты, если они есть, но не будет инициализировать пустой, вам может понадобиться создать объект «work», чтобы отображались поля формы. – guiniveretoo

+0

это swapped '- @ game_details.fighting_game_main_characters.each do | main_character |' и '= f.simple_fields_for: combo_book_combo_works do | works |', и все имена и теги выбора отображаются, но они все еще не записываются в таблицу соединений и только последний тег select отображается в переданных параметрах. ' – chun