2015-06-22 52 views
1

我正在嘗試做一些我認爲是非常基本的事情,但我對Rails很陌生,不確定自己做錯了什麼。我已經通過了幾個教程,並尋找答案,並找不到問題所在。將不勝感激任何幫助!在Rails中顯示和編輯has_many對象

我有模式設置,使客戶有哪些有很多里程碑許多項目:

class Client < ActiveRecord::Base 
    has_many :projects, :dependent => :destroy 
end 

class Project < ActiveRecord::Base 
    belongs_to :client 
    has_many :milestones, :dependent => :destroy 
end 

class Milestone < ActiveRecord::Base 
    belongs_to :project 
end 

路線的設置如下:

resources :clients 
resources :milestones 
resources :projects do 
    resources :milestones 
end 

在項目/ show.html。 erb,我想顯示與項目相關的每個里程碑,並提供一個表單,在同一頁面上添加新的里程碑。當我提交表格時,它添加了一個新的里程碑(UL.card列表中的新LI),但沒有顯示任何值。下面是項目/ show.html.erb代碼:

<h2><%= @project.name %> Milestones</h2> 

    <ul class="card-list"> 
    <% @project.milestones.each do |m| %> 
    <li> 
     <div class="card-header"> 
     <%= m.date %> 
     </div> 
     <div class="card-body"> 
     <h3 class="name"><%= m.name %></h3> 
     <p class="description"><%= m.description %></p> 
     </div> 
    </li> 
    <% end %> 
    <li> 
     <div class="card-header"> 
     New Milestone 
     </div> 
     <div class="card-body"> 
     <%= form_for [@project,Milestone.new] do |f| %> 
     <%= f.hidden_field(:project_id, value: @project.id) %>   
      <div class="field"> 
      <%= f.label :milestone %> 
      <%= f.text_field :name %> 
      </div> 
      <div class="field"> 
      <%= f.label :description %> 
      <%= f.text_area :description %> 
      </div> 
      <div class="field"> 
      <%= f.label :date %> 
      <%= f.date_field :date %> 
      </div> 
      <div class="actions"> 
      <%= f.submit "Add Milestone" %> 
      </div> 
     <% end %>   
     </div> 
    </li> 
    </ul> 

下面是通過表單中傳來的參數:

Parameters: { 
    "utf8"=>"✓", 
    "authenticity_token"=>"3D12GTH+IhwMMQDKsj2l+KXe7OBxmub3eejb3pbpWao=", 
    "milestone"=>{ 
    "project_id"=>"1", 
    "name"=>"Test Milestone", 
    "description"=>"test descrip", 
    "date"=>"2015-06-26" 
    }, 
    "commit"=>"Add Milestone", 
    "project_id"=>"1" 
} 

里程碑控制器:

def create 
    @project = Project.find(params[:project_id]) 
    @milestone = @project.milestones.create!(params[milestone_params]) 
    redirect_to @project 
    end 

    private 
    def milestone_params 
    params.require(:milestone).permit(:name, :description, :completed, :date, :project_id) 
    end 

請讓我知道是否有任何其他信息可以提供幫助。謝謝!

+0

「我想要顯示與項目相關的每個里程碑,並提供在同一頁面上添加新項目的表單。」你的意思是「增加新的里程碑」? – max

+0

正確,增加新的里程碑。謝謝,Maxcal。 – KilgoreTrout

回答

0

既然你需要同時支持(POST /milestonesPOST /projects/:project_id/milestones)的project_id到窗體:

<%= form_for [@project,Milestone.new] do |f| %> 
    ... 
    <%= f.hidden_field(:project_id, value: @project_id) %> 
    ... 
<%- end -%> 

或者,如果你的資源始終嵌套比project_id在控制器的PARAMS可用,因此你可以通過它:

class MilestonesContoller < ApplicationController 
    def create 
    @milestone = Milestone.new(milestone_params) 
    # this part was originally omitted for brevity. 
    if @milestone.save 
     redirect_to @milestone.project 
    else 
     render :new 
    end 
    end 

    # don't trust params from the scary interwebs 
    def milestone_params 
    params.require(:milestone) 
      .permit(:project_id, :name, :description, :date) 
    end 
end 

注意你確實需要這個代碼在你的控制器的其他操作結合起來。這只是一個顯示相關概念的極簡例子。不是意味着完整的複製粘貼完成解決方案。

你也可以減少你的路由文件到:

resources :clients 
resources :milestones 
resources :projects do 
    resources :milestones 
end 

使用options for resources,如果你需要定製路線。

+0

感謝您提供關於路線文件的提示,maxcal!不幸的是,我仍然看到里程碑值沒有出現的相同問題。我更新了這個問題,並在我的控制器中添加了一些有用的信息。 如果我替換此: '@milestone = @ project.milestones.create(PARAMS [milestone_params])' 本: '@milestone = Milestone.new(milestone_params)' 那麼它不再甚至在我提交表格時更新里程碑的數量。有任何想法嗎? – KilgoreTrout

+0

爲了簡潔,我省略了創建方法的其餘部分。一個'#...'評論通常意味着作者已經遺漏了部分代碼,並且您需要自己做一些程序集。我編輯了這個問題並添加了缺失的部分。 – max

+1

就是這樣。謝謝,maxcal!非常感激! – KilgoreTrout