更新复杂的链接表

时间:2012-11-15 19:27:49

标签: ruby-on-rails ruby forms

如何解决以下问题:

我想在表 submitted_pictures 中添加一个新行,其链接如下:

game.rb
    has_many :rounds
    has_many :participants, :dependent => :destroy
    has_many :submitted_pictures, :through => :rounds
    has_many :users, :through => :participants
    accepts_nested_attributes_for :participants
    accepts_nested_attributes_for :rounds, :reject_if => :all_blank

round.rb
    belongs_to :game
    has_many :submitted_pictures, :dependent => :destroy
    accepts_nested_attributes_for :submitted_pictures

submitted_picture.rb
    has_one :round
    has_one :game, :through => :rounds
    belongs_to :user

所以我可以致电:

<% @user.games.rounds.last.submitted_pictures.each do |blabla| %><% end>

我使用以下方法制作了一个复杂的表格:

<%= form_for(@game) do |f| %>
    <%= f.fields_for :round do |ff| %>
        <%= ff.fields_for :submitted_pictures do |fff| %>
            <%= fff.label :flickr_id %>
            <%= fff.text_field :flickr_id %>
        <% end %>
    <% end %>
    <%= f.submit "Submit Picture", class: "btn btn-primary" %>
<% end %>

希望在flickr_id(现在持有一个httplink)中添加一个新的submitted_picture,链接到当前游戏(@game)。

我一直在尝试更新一些内容,但似乎没有让步:( update_attributes 完全错误,我现在看到了:p)

def update
    @game = Game.find(params[:id])
    if @game.rounds.last.submitted_pictures.update_attributes(params[:id])
        flash[:success] = "Pic Submitted!"
    else
        render :action => 'new'
    end
end

另外

def update
    @game = Game.find(params[:id])
    if @game.save
        flash[:success] = "Pic Submitted!"
        redirect_to games_path
    else
        render :action => 'new'
    end

我无法让它发挥作用。我遇到了各种各样的错误,所以不要在这里注意到它们,我认为最好是要求最好的解决方案。

简而言之,我想要将submitted_picture添加到游戏的最新一轮(最近的created_at)。

1 个答案:

答案 0 :(得分:1)

我认为在游戏形式中嵌套所有内容会让事情变得不必要。如果我理解正确,你想创建一个新的submitted_picture,它需要选择一个游戏。该轮不是直接选择,但只是游戏的最新版本。 (这听起来像是一个可疑的假设 - 但它确实让事情更简单,所以我会用它滚动)

所以只需创建一个新的submitted_picture表单,然后添加一个游戏选择。

在你的处理程序中,从游戏中拉出最新一轮并将该轮融合到你的参数中以保存新图片。

这样做你想要的吗?