用户团队应用程序

时间:2012-08-26 21:44:26

标签: ruby-on-rails ruby-on-rails-3 activerecord associations

我需要创建用户团队。用户属于团队(仅一个团队),团队拥有许多用户。我无法弄清楚如何让用户能够创建,加入和离开团队。以下是我到目前为止所做的事情,但我确信我正在做一些非常糟糕的事情(并且“newby”错误)。

用户模型:

belongs_to :teams, dependent: :destroy

def team_member?(team)
    team_relationships.find_by_team_id(team.id)
end

def join!(team)
    team_relationships.create!(team_id: team.id)
end  

def unjoin!(team)
    team_relationships.find_by_team_id(team.id).destroy
end

团队模型

has_many :users, through: :team_relationships, dependent: :destroy

attr_accessible :team_name, :team_id

validates :user_id, presence: true
validates :team_name, presence: true, length: { maximum: 140 }

default_scope order: 'teams.created_at DESC'

team_relationship模型

attr_accessible :team_id

belongs_to :team
belongs_to :user

validates :team_id, presence: true  

路线:

  resources :teams do
    member do
      get 'join'
      get 'leave'
    end
  end

teams_controller:

def join
  @team = Team.find params[:team_id]
  current_user.update_attribute(:team_id, @team.id)
  redirect_to @user
end

def leave
  @team = Team.find params[:id]
  current_user.update_attribute(:team_id, nil)
  redirect_to @user
end

_join_team.html.erb

<%= form_for(current_user.team_relationships.build(team_id: @team_id),
             remote: true) do |f| %>
  <div><%= f.hidden_field :team_id %></div>
  <%= f.submit "Join", class: "btn btn-large btn-primary" %>
<% end %>

_unjoin_team.html.erb

<%= form_for(current_user.team_relationships.find_by_team_id(@team_id),
         html: { method: :delete }) do |f| %>
  <%= f.submit "Leave Team", class: "btn btn-large" %>
<% end %>

如果你不能说我试图调整Hartl教程中的一些内容用于此目的。我做错了什么?

我相信我已经找到了模型,但现在我不确定如何让用户创建团队,摧毁团队,加入团队或离开团队。我需要在模型,控制器和视图中做些什么来实现它?

3 个答案:

答案 0 :(得分:2)

我明白了。构建方法不起作用。该团队已经建立,用户已经建立。我只需要建立连接。这就是我所拥有的:

团队控制器:

def show
  @team =  Team.find(params[:id])
  @team_members = @team.users
  @user = User.find(params[:id]) if signed_in?
end

加入按钮部分:

<%= form_for(@user) do |f| %>
  <%= f.hidden_field :team_id, :value => @team.id %>
  <%= f.submit "Join Team", class: "btn btn-large btn-primary" %>
<% end %>

答案 1 :(得分:0)

不确定这是否是您的问题,但

belongs_to :teams

应该是

belongs_to :team

属于永远是单数。

编辑:看起来你想要多对多的关系。试试这个:

class User
  has_many :team_relationships, dependent: :destroy
  has_many :teams, through: :team_relationships
end

class Team
  has_many :team_relationships, dependent: :destroy
  has_many :users, through: :team_relationships
end

class TeamRelationship
  belongs_to :user
  belongs_to :team
end

我认为应该这样做。

答案 2 :(得分:0)

当您只有一个关系时,您不需要has_manythrough     作为用户belongs_toone个团队和团队many个用户has_many - &gt; belongs_to关系

用户模型:

belongs_to :team

validates :user_id, presence: true

def team_member?
    team.present?
end

def join!(team)
  return false if team_member?
  team.create!(team_id: team.id)
end  

def unjoin!
  return if team_member?
  team.destroy
end

团队模型

has_many :users

attr_accessible :team_name, :team_id

validates :team_name, presence: true, length: { maximum: 140 }

default_scope order: 'teams.created_at DESC'

TeamRelationship模型#NOT NEEDED

_join_team.html.erb

<%= button_to "Join", join_teams_path(current_user.team_build(team_id: @team_id),  class: "btn btn-large btn-primary", remote: true %>

_unjoin_team.html.erb

<%= button_to "Leave Team", leave_teams_path(current_user.team) , class: "btn btn-large btn-primary" , remote: true  %>

team_controllor

 def join
   @team = Team.find params[:id]
   if current_user.join!(@team.id)
     redirect_to @user #NOTE dont use redirect when you perform actions with ajax.
   else
     #render some error
   end
 end

def leave
  if current_user.unjoin!
     redirect_to @user #NOTE dont use redirect when you perform actions with ajax.
   else
     #render some error
   end
end

我建议你浏览一些来自rails的文档,这些文档定义明确

http://guides.rubyonrails.org/ajax_on_rails.html

http://railscasts.com/episodes/205-unobtrusive-javascript

http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html

http://guides.rubyonrails.org/association_basics.html