如何在Rails / Active Record中保存关联的对象

时间:2012-01-12 23:08:52

标签: ruby-on-rails activerecord

假设我有两种型号:Team - 1 --- n - >播放机 用语言:一个团队可以有很多玩家。玩家属于团队。

在显示Team-Data的页面上,我想放置一个链接'create Player'。

在Players控制器中,如何创建播放器以使其与团队相关联,查看放置“创建播放器”链接的位置?

我必须

1。将Team-ID传递给“创建玩家”控制器并

2。使用Team-ID查找团队,然后

3。类似这样的内容:@new_player = @team.players.build(...)

我可以使用其中一条资源路线作为“创建播放器”链接吗?

2 个答案:

答案 0 :(得分:2)

如果团队和球员将通过单独的表格添加:

您可以在新玩家的表单中包含team_id,也可以将路线嵌套到团队范围内的玩家中,并从params[:team_id]等网址参数中拉出team_id。

嵌套玩家路线:

    resources :teams do
      resources :players
    end

在您的团队/节目视图(团队详细信息页面)中,创建播放器链接:

    <%= link_to 'Create Player', new_team_player_path(@team) %>

在球员形式中:

    <% form_for [@team, @player] do |f| %>
    <!-- your form here -->
    <%- end -%>

在玩家控制器中:

    def new
      @team = Team.find params[:team_id]
      @player = Player.new
    end

    def create
      @player = Player.new params[:player]
      @player.team_id = params[:team_id] # => if just grabbing the id from the url params
      if @player.save
        # flash and redirect
      else
        # show form again
      end
    end

否则,请参阅有关@Antoine提到的嵌套属性的railscast,以便在一个表单上指定新的团队和玩家详细信息。 (我认为你正在寻找的是有两种形式的第一种选择,但我可能会离开。)

有关嵌套资源路由的详细信息,请参阅Rails Routing Guide。要查看应用程序中可用的路由,请从应用程序根目录的命令行运行rake routes

答案 1 :(得分:1)

我认为nested_attributes可以帮助你。

观看this关于它的railscast。