Ruby on rails Rails用户>;团队>;成员

Ruby on rails Rails用户>;团队>;成员,ruby-on-rails,controller,belongs-to,Ruby On Rails,Controller,Belongs To,我是Rails新手,我正在尝试在我的应用程序中构建: 签名队长创建一个团队(姓名、颜色等),然后在其中添加成员。成员将自动分配给创建的团队 我的签名队长有一个按钮,可以在他的个人资料中创建一个新团队,它会进入团队的“新视图”。 验证团队表单后,将加载成员#new以将成员逐个添加到团队中 我设置了模型关系: Captain: has_many :teams has_many :members through :team Team: belongs_to :captain #captain_id

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

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

我的签名队长有一个按钮,可以在他的个人资料中创建一个新团队,它会进入团队的“新视图”。 验证团队表单后,将加载成员#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

我发现了如何使用Desive和current_user将队长id添加到团队表中,但我不知道团队创建后如何处理队长id。我想在“添加成员”视图中获取团队id值,并与我的成员控制器进行处理,以便与每个成员一起保存。

如果您以以下方式组织路线,您将可以访问成员页面上的团队和成员详细信息以及团队页面上的团队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\u path
team\u path(@team)
对于成员:
团队成员路径(@team)
团队成员路径(@team,@member)

在teams_controller中,当提供团队id时,您可以访问
params[:id]
。例如,在url
/teams/1
中,
参数[: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

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

使用嵌套资源:

routes.rb:

resources :cards do 
resources :teammates 
end
队友新观点

<%= form_for [@card,@teammate] do |f| %>
...
<% end %>
我试图在members controller中设置一个前置过滤器: 前\u过滤器:需要\u卡 私有的 def需要U卡 @队友=队友。查找(参数[:id]) 结束

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

如果有适当的方法来做这个把戏/提高我的学习能力,我很想了解他们,所以请随时给我线索


谢谢大家!

你能为团队和成员发布你的路线吗?您可以使用
资源:团队做资源:成员结束
。然后在浏览团队时使用
params[:id]
,在查看团队成员时使用
params[:team_id]
。你好,Nathan,谢谢你的快速回答。因为我使用scaffold生成团队和成员,所以我的路线非常空。资源:成员资源:团队为:队长,:控制员=>{:注册=>“注册/注册”}设计_,以防您不知道,您可以使用它在帖子正文中格式化代码片段。这有助于使您的问题/答案更加简洁易读。只需添加它们即可。谢谢你的提示。非常感谢你,内森,这很有帮助。我按照你的建议设置了资源。我想我更了解params[:id]的原理。在创建成员控制器时,我正在尝试将新属性team_id正确添加到成员控制器中。我是否必须删除“members\u params”@member=member.new(members\u params)
members\u params
指定您希望发送的属性(通常在为新的或更新调用批量分配属性时使用)。如果成员分配与您一样,那么您可以分配
@member.team\u id=params[:team\u id]
或者您可以包括(并允许)团队id作为成员参数的一部分进行传递。现在一切都正常了,谢谢您的帮助!关于嵌套资源,我有几个理论问题:-既然团队和成员之间有嵌套关系,为什么我必须精确@member.team\u id=params[:team\u id]创建新成员时手动(成员#创建)?您也可以在您的成员表单中包含:team_id作为隐藏菜单或选择菜单,并在您的成员参数方法中包含:permit setting:team_id。两者都可以工作。您拥有的关联更多用于浏览资源。模型本身不知道如何访问它们。这是一个单独的问题。您无法发布他自己的名字,而不是对上述无关问题的回答……命名方面,我会根据您正在检索的内容命名before筛选器,如
find\u队友
find\u card
。这样,您可能只希望在请求特定操作时运行before\u筛选器。
before\u筛选器:find\u card,only:[:index,:show]
或类似内容。
  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