在Rails中呈现form_for时,将对象id作为参数传递

时间:2015-12-13 15:45:38

标签: ruby-on-rails forms for-loop

在Rails中开发新手并且卡住了。我正在尝试将玩家对象的id作为参数传递给表单,以根据玩家ID和匹配ID创建匹配的可用性。用户拥有许多玩家,并且当登录时,current_user可以为其玩家提供匹配的可用性。

我正在将此表格称为匹配节目页面,并且正在传递的匹配ID(下面的错误中的4)导致错误。

Couldn't find Player with 'id'=4 [WHERE "players"."user_id" = ?]

我正在尝试使用render将player.id作为参数值传递给表单。

#/views/matches/show.html.erb

<% current_user.players.each do |player| %>
  <tr>
    <td><%= player.name %></td>
    <td><%= render 'attend_form', :id => player.id %></td>
  </tr> 

然后使用播放器ID作为'attend_form'中的参数,就像这样。

#/views/matches/_attend_form.html.erb

<div id="attend_form">
    <%= form_for (current_user.players.find(params[:id]).availabilities.new(match_id: @match.id)) do |f| %>
    <div>
        <%= f.hidden_field :match_id %>
        <%= f.hidden_field :player_id, :value => params[:id] %>
        <%= f.hidden_field :available, :value => TRUE %>

    </div>
        <%= f.submit "Attend" %>
    <% end %>
</div>

提交后,应该在可用性控制器中调用create以创建匹配可用性。

#/views/matches/availabilities_controller.rb

def create
    @availability = Availability.new(availability_params)
    if @availability.save
      flash[:success] = "You are now attending this match"
      redirect_to :back
    else
      flash[:danger] = "Something went wrong"
      redirect_to :back
    end
  end

玩家匹配和可用性之间的关系设置如下:

匹配

class Match < ActiveRecord::Base

has_many :availabilities
has_many :players, through: :availabilities

状况

class Availability < ActiveRecord::Base

belongs_to :player
belongs_to :match

播放器

class Player < ActiveRecord::Base

belongs_to :user
has_many :availabilities, :dependent => :destroy
has_many :matches, through: :availabilities

和用户

class User < ActiveRecord::Base

has_many :players
has_many :availabilities

非常感谢可以给予的任何帮助!就像我说的Rails开发新手一样。

1 个答案:

答案 0 :(得分:0)

出现此错误是因为current_user在DB中没有Player且id == 4。首先,您需要检查此播放器是否属于用户,然后呈现表单。