0

我需要创建一个进入连接表的选择标签列表。我创建了这个循环

- @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"

添加它按预期显示。当我点击提交时,它不会写入连接表。我查看了日志,发现只有最后一个选择标签在提交的参数中

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,所以我添加了

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

和所需的参数

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)

需要写入的连接没有显示出来。我需要做什么才能使循环生成的所有选择标记都写入连接表?

4

1 回答 1

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_combocombo_book_combo_works_attributes

立即查看您的表单,尤其是其中的一点combo_book_combo_characters_attributes- 看起来表单的那部分是使用嵌套表单属性正确构建的。您可能会进行更改simple_fields_for,使其成为在父窗体(类似于f.simple_fields_for)上调用的方法,而不是独立的视图辅助方法调用。

于 2016-11-27T15:36:45.777 回答