2010-11-25 7 views
0

Ich habe zwei Controller: Projekte und Stufen.Wie zeige ich alle Phasen (ein Modell) an, die zu einem Projekt (einem anderen Modell) in Rails 3 gehören?

Projekte hat viele Stufen und Bühnen gehört zu Projekten. Ich möchte, wenn Sie auf den Namen des Projekts (d. H. Die Projekte zeigen Aktion) klicken, um alle Phasen zu diesem Projekt anzuzeigen.

Wie mache ich das?

Stages Controller 

class StagesController < ApplicationController 
    filter_resource_access 

    # GET /stages 
    # GET /stages.xml 
    def index 
    @stages = Stage.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @stages } 
    end 
    end 

    # GET /stages/1 
    # GET /stages/1.xml 
    def show 
    @stage = Stage.find(params[:id]) 
    #@project = Project.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @stage } 
    end 
    end 

    # GET /stages/new 
    # GET /stages/new.xml 
    def new 
    @stage = Stage.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @stage } 
    end 
    end 

    # GET /stages/1/edit 
    def edit 
    @stage = Stage.find(params[:id]) 
    end 

    # POST /stages 
    # POST /stages.xml 
    def create 
    @stage = current_user.stages.create(params[:stage]) 
    #@stage = Stage.new(params[:stage]) 

    respond_to do |format| 
     if @stage.save 
     format.html { redirect_to(@stage, :notice => 'Stage was successfully created.') } 
     format.xml { render :xml => @stage, :status => :created, :location => @stage } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @stage.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /stages/1 
    # PUT /stages/1.xml 
    def update 
    @stage = Stage.find(params[:id]) 

    respond_to do |format| 
     if @stage.update_attributes(params[:stage]) 
     format.html { redirect_to(@stage, :notice => 'Stage was successfully updated.') } 
     format.xml { head :ok } 
     else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @stage.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /stages/1 
    # DELETE /stages/1.xml 
    def destroy 
    @stage = Stage.find(params[:id]) 
    @stage.destroy 

    respond_to do |format| 
     format.html { redirect_to(stages_url) } 
     format.xml { head :ok } 
    end 
    end 
end 

Stages model: 

# == Schema Information 
# Schema version: 20101124095341 
# 
# Table name: stages 
# 
# id   :integer   not null, primary key 
# project_id :integer 
# created_at :datetime 
# updated_at :datetime 
# user_id :integer 
# name  :string(255) 
# stage_num :integer 


class Stage < ActiveRecord::Base 

    belongs_to :projects 
    #has_and_belongs_to_many :users 

    has_many :uploads 
    has_many :comments 

end 


Projects Model 

# == Schema Information 
# Schema version: 20101117094659 
# 
# Table name: projects 
# 
# id   :integer   not null, primary key 
# name  :string(255) 
# description :string(255) 
# designer_id :integer 
# client_id :integer 
# notified :boolean 
# created_at :datetime 
# updated_at :datetime 
# user_id  :integer 

class Project < ActiveRecord::Base 

    belongs_to :user 
    has_many :stages 
    has_many :uploads 
    has_many :comments 

    #before_validation { |project| project.user = Authorization.current_user unless project.user } 

end 

Project Controller 

class ProjectsController < ApplicationController 
    filter_resource_access 

    # GET /projects 
    # GET /projects.xml 
    def index 
    @projects = current_user.projects 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @projects } 
    end 
    end 

    # GET /projects/1 
    # GET /projects/1.xml 
    def show 
    @project = Project.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @project } 
    end 
    end 

    # GET /projects/new 
    # GET /projects/new.xml 
    def new 
    @project = Project.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @project } 
    end 
    end 

    # GET /projects/1/edit 
    def edit 
    @project = Project.find(params[:id])  
    end 

    # POST /projects 
    # POST /projects.xml 
    def create 
    @project = current_user.projects.create(params[:project]) 

    respond_to do |format| 
     if @project.save 
     format.html { redirect_to(@project, :notice => 'Project was successfully created.') } 
     format.xml { render :xml => @project, :status => :created, :location => @project } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @project.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /projects/1 
    # PUT /projects/1.xml 
    def update 
    @project = Project.find(params[:id]) 

    respond_to do |format| 
     if @project.update_attributes(params[:project]) 
     format.html { redirect_to(@project, :notice => 'Project was successfully updated.') } 
     format.xml { head :ok } 
     else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @project.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /projects/1 
    # DELETE /projects/1.xml 
    def destroy 
    @project = Project.find(params[:id])  
    @project.destroy 

    respond_to do |format| 
     format.html { redirect_to(projects_url) } 
     format.xml { head :ok } 
    end 
    end 
end 

Projekte Show View

<p id="notice"><%= notice %></p> 

<br /> 
<% @projects.each do |project| %> 

    <% @stages.each do |stage| %> 
     <tr> 
     <td><%= link_to stage.name, stage %> | </td> 
     <td><%= stage.stage_num %> | </td> 

     <td><%= link_to 'Show', stage %></td> 
     <td><%= link_to 'Edit', edit_stage_path(stage) %></td> 
     <td><%= link_to 'Destroy', stage, :confirm => 'Are you sure?', :method => :delete %></td> 
     </tr> 
    <% end %> 

<% end %> 

<% if permitted_to? :create, Stage.new %> 
    <%= link_to 'New Stage', new_stage_path %> 
<% end %><br /><br /> 

<%= link_to 'Edit', edit_project_path(@project) %> | 
<%= link_to 'Back', projects_path %> 

Antwort

1

Es gibt viele Möglichkeiten, dies zu tun:

des jeweiligen Code Alle können Sie unten. Der einfachste Weg, dies mit Ihrem bestehenden Code zu erreichen, besteht darin, die Ansichtsseite des Projekts zu ändern.

diese ersetzen:

<% @projects.each do |project| %> 

    <% @stages.each do |stage| %> 

mit:

<% @project.stages.each do |stage| %> 

Dann würden Sie die "Index" Ansicht verwenden, um alle Projekte zu zeigen und die "Show" Ansicht wäre Projektspezifika zu zeigen, (die Stufen enthalten würde)

+0

Hrmm Aaron, sieht aus wie ich einen Fehler gemacht habe. Das sollte für die Stages Show View sein, nicht für die Projects Show View. Bedenkt das Edit, ändert das deine Antwort? Edit: Scratch dass ... nur noch einmal meinen Code überprüft und es stellt sich heraus, dass Sie Recht haben. Es war für die Projektschau, nicht für die Bühnen. – marcamillion

+0

Btw Aaron, welchen Teil der Rails Guides kann ich gehen, um herauszufinden, wie man das macht? Ist das ein Teil der Modelle? Controller? Würde mich freuen, wenn Sie einen Link zur Verfügung stellen könnten. Vielen Dank. – marcamillion

+0

Dies sind eher Kernkonzepte. Hast du schon gelesen: http://pragprog.com/titles/rails3/agile-web-development-with-rails-third-edition das noch? Wenn nicht, würde ich dringend empfehlen, zuerst dieses Buch durchzugehen. Es vermittelt Ihnen ein solides Verständnis der meisten Kernkonzepte von Rails. –

Verwandte Themen