用户团队轨道应用程序



我需要创建用户团队。一个用户属于一个团队(只有一个团队( 一个团队有很多用户。我不知道如何让用户能够创建、加入和离开团队。以下是我到目前为止所拥有的,但我确定我正在做一些可怕的事情(并且"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 教程中的一些内容。我做错了什么?

我相信我已经弄清楚了模型,但现在我不确定如何让用户创建团队、摧毁团队、加入团队或离开团队。我必须在模型、控制器和视图中执行哪些操作才能实现它?

我想通了。生成方法不起作用。团队已经建立,用户也已经建立。我只需要建立连接。这是我所拥有的:

团队控制器:

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 %>

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

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

我认为应该这样做。

当你只有一个关系船时,你不需要has_manythrough 由于用户belongs_to只有one团队和团队many用户,因此has_many-> 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'

团队关系模型 #NOT 需要

_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

最新更新