2014-11-06 5 views
0

Im пытается сделать форму, где пользователь может выбрать кодовое имя, состоит из двух частей. Он может успешно создавать и сохранять форму, но это только сохраняет животную часть кодового имени.Rails Forms Two Selects One Value

<h2>Join Game</h2> 
<%= form_for([@game, @game.players.build]) do |f| %> 
<p> 

<% adjArray = ["Alert","Ancient","Brave","Charming","Cheerful","Courageous","Deafening","Determined","Eager","Enchanting","Enthusiastic","Fancy","Friendly","Hissing","Loud","Mad","Old","Proud","Quick","Screeching","Silent","Silly","Slippery","Sour","Sparkling","Squeaky","Strong","Thundering","Victorious","Wild","Witty","Wonderful"]%> 
<%= select(:player, :codename, adjArray) %> 
<% animalArray = ["Ant","Bird","Cat","Chickken","Cow","Dog","Elephant","Fish","Fox","Horse","Humming Bird","Kangaroo","Lion","Monkey","Penguin","Pig","Rabbit","Sheep","Tiger","Whale","Wolf"] %> 
<%= select(:player, :codename, animalArray) %> 


<p> 
<%= f.submit %> 
</p> 
<% end %> 

Код контроллера

class PlayersController < ApplicationController 
    def create 
     @game = Game.find(params[:game_id]) 
     @player = @game.players.create(player_params) 
     redirect_to game_path(@game) 
    end 

    private 
    def player_params 
     params.require(:player).permit(:codename, :alive, :target) 
    end 
end 

Пс. Это в Rails, игроки принадлежат к играм, а на Играх много игроков

ответ

0

Я бы использовал виртуальные атрибуты для хранения значений для двух частей кодового имени. Я также перемещаю массивы в вашу модель Player и добавляю валидации для виртуальных атрибутов.

модель игрока (добавить массивы, виртуальные атрибуты и проверки):

class Player < ActiveRecord::Base 
    after_initialize :set_codename_parts 
    after_validation :save_codename 

    attr_accessor :codename_adj, :codename_animal 

    ADJ_ARRAY = ["Alert","Ancient","Brave","Charming","Cheerful","Courageous","Deafening","Determined","Eager","Enchanting","Enthusiastic","Fancy","Friendly","Hissing","Loud","Mad","Old","Proud","Quick","Screeching","Silent","Silly","Slippery","Sour","Sparkling","Squeaky","Strong","Thundering","Victorious","Wild","Witty","Wonderful"] 

    ANIMAL_ARRAY = ["Ant","Bird","Cat","Chickken","Cow","Dog","Elephant","Fish","Fox","Horse","Humming Bird","Kangaroo","Lion","Monkey","Penguin","Pig","Rabbit","Sheep","Tiger","Whale","Wolf"] 

    validates :codename_adj, inclusion: { in: ADJ_ARRAY } 
    validates :codename_animal, inclusion: { in: ANIMAL_ARRAY } 

    # your existing Player model code... 

    private 

    def set_codename_parts 
     return if codename.blank? 
     @codename_adj ||= codename.split(' ')[0] 
     @codename_animal ||= codename.split(' ')[1] 
    end 

    def save_codename 
     self.codename = [codename_adj, codename_animal].join(' ') 
    end 
end 

контроллер игрока (изменить player_params метод):

def player_params 
    params.require(:player).permit(:codename_adj, :codename_animal, :target, :alive) 
end 

Form (удалить текущие объявления массива и выберите (. ..)):

<%= select :player, :codename_adj, Player::ADJ_ARRAY %> 
<%= select :player, :codename_animal, Player::ANIMAL_ARRAY %>