Rails用户>团队>成员

时间:2013-12-17 23:48:06

标签: ruby-on-rails controller belongs-to

我是Rails的新手,我正在尝试在我的应用中构建它:

签名船长创建一个团队(名称,颜色等),然后在其中添加成员。成员将自动分配给创建的团队。

我签名的队长有一个按钮,可以在他的个人资料中创建一个新的团队,然后进入团队#new视图。 验证团队表单后,会加载成员#new以逐个向团队添加成员。

我建立了模型关系:

Captain:
has_many :teams
has_many :members through :team

Team: 
belongs_to :captain #captain_id
has_many :members

Member:
belongs_to :team #team_id
has_one :captain

我找到了如何使用devise和current_user在团队表中添加captain_id,但是我无法弄清楚团队创建后如何处理team_id。我想在“添加成员”视图中获取team_id值并处理我的成员控制器以将其保存到每个成员。

2 个答案:

答案 0 :(得分:0)

如果您按以下方式构建路线,您将可以访问成员页面上的团队和成员详细信息以及团队页面上的团队ID:

# config/routes.rb
resources :teams do
  resources :members
end

# uncomment to have members viewable when not associate with a team in the url
# resources :members

您可以使用命名路线路由到团队:teams_pathteam_path(@team) 对于会员:team_members_path(@team)team_member_path(@team, @member)

在teams_controller中,您可以在提供团队ID时访问params[:id]。例如,在网址/teams/1中,params[:id]会保留值1

在成员控制器中,您将拥有params[:team_id]params[:id]将保留成员ID。

例如:

# app/controllers/teams_controller.rb
def show
  @team = Team.find params[:id]
end

# app/controllers/members_controller.rb
def index
  # finds the team and pre-loads members in the same query
  @team = Team.includes(:members).find(params[:team_id])
end

# /teams/1/members/2
def show
  @member = Member.find params[:id]
end

答案 1 :(得分:0)

所以我们有一张包含多个队友的卡

使用嵌套资源:

routes.rb:

resources :cards do 
resources :teammates 
end

队友新观点

<%= form_for [@card,@teammate] do |f| %>
...
<% end %>

队友控制员

  def index
    @card = Card.includes(:teammates).find(params[:card_id])
    @teammates = Teammate.all
  end

  # GET /teammates/1
  # GET /teammates/1.json
  def show
    @teammate = Teammate.find(params[:id])
  end

  # GET /teammates/new
  def new
    @card = Card.find(params[:card_id])
    @teammate = Teammate.new
  end

  # GET /teammates/1/edit
  def edit
    @teammate = Teammate.find(params[:id])
  end

  # POST /teammates
  # POST /teammates.json
  def create
    @card = Card.find(params[:card_id])
    @teammate = Teammate.new(teammate_params)
    @teammate.card_id = params[:card_id]
    respond_to do |format|
      if @teammate.save
        format.html { redirect_to @teammate, notice: 'Teammate was successfully created.' }
        format.json { render action: 'show', status: :created, location: @teammate }
      else
        format.html { render action: 'new' }
        format.json { render json: @teammate.errors, status: :unprocessable_entity }
      end
    end
  end

我尝试在成员控制器中放置一个前置过滤器: before_filter:require_card 私人的 def require_card   @tematete = Teammate.find(params [:id]) 端

但它给我带来了错误,所以我放弃了它

如果存在正确的方法来改善我的学习,我很想知道他们,所以请随时给我提供线索。

谢谢!