2017-07-19 58 views
-1

所以我有这样的应用程序结构:一个Game模型有很多Allies和很多Enemies在Rails中提交多个表单的自定义动作

我想为Game创建一个自定义操作,致力于创建并提交敌人和盟友。 所以在视图中我会有2个fields_for你可以同时提交。

我从来没有创建过自定义路线和行为,或者在同一页面中提交了2个子表单。

任何人都知道我该怎么做?感谢

+0

你有玩家模型吗?如果是的话,'游戏'和'玩家'之间的关联是什么? – Pavan

+0

我没有玩家模型。游戏has_many:盟友和has_many:敌人。 – LRP

回答

1

的routes.rb

#this route shows the form 
get 'create-players/:id', to 'game#new_players', as: :new_players 
# this route recieves the form post submission 
post 'create-players/:id', to 'game#create_players', as: :create_players 

应用程序/控制器/ game_controller.rb:

def new_players 
    @game = Game.find(params[:id]) 
end 

def create_players 
    #do whatever you want with the params passed from the form like 
    @allies = Ally.create(game_id: params[:id], name: params[:ally_fields][:name]) 
    @enemies = Enemy.create(game_id: params[:id], name: params[:enemy_fields][:name]) 
    @game = Game.find(params[:id]) 
end 

应用/视图/游戏/ new_players.html.erb:

<%= form_tag(create_players_paths, @game.id), method: 'POST') do %> 
    <% #...fields you have on models, perhaps %> 
    <% fields_for :ally_fields do |f| 
    <%= f.text_field :name, nil, placeholder: "Ally name", required: true 
    <% end % > 
    <% fields_for :enemy_fields do |f| 
    <%= f.text_field :name, nil, placeholder: "Enemy name", required: true 
    <% end % > 
    <%= submit_tag "create players", class: "submit" %> 
<% end %> 

app/views/game/create_players.html.erb:

<h1> Woah an allie and an enemy have been added to game <%= @game.id %></h1> 
    <p> Lets see some blood!</p> 

当然,您应该对输入和处理后提交之前执行验证。通常你会希望在对象之间使用已建立的关系,这样你就可以在视图@model = Modelname.new然后form_for @object上执行操作,并且可以以更简洁的方式访问验证和错误消息。

+0

必须将'post_create-players /:id'改为'game#create_players',如::create_players'将'get'create-players /:id'改为:'games#create_players',如:: create_players'使其工作,但提交按钮现在不工作,虽然 – LRP

+0

我需要2路由吗? – LRP

+0

@LRP写了更多解释 –