2014-11-06 56 views
0

我試圖做一個窗體,用戶可以選擇一個代碼名是由兩部分組成。它可以成功創建並保存表單,但只保存代碼名稱的動物部分。Rails窗體兩個選擇一個值

<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

我會使用虛擬屬性來保存代號的兩個部分的值。我還會將數組移動到您的播放器模型中,併爲虛擬屬性添加驗證。

播放器模型(添加陣列,虛擬屬性和驗證):

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 

表格(刪除當前數組聲明和選擇(。 ..)):

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