2014-11-06 58 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 %>