2012-12-05 17 views
5

Mam zdefiniowane zagnieżdżone zasobów w /config/routes.rbRuby on Rails Zagnieżdżone zasoby niezdefiniowany droga metoda

resources :goals do 
    resources :goal_entries 
    end 

modele dla Cel:

class Goal < ActiveRecord::Base 
    attr_accessible :code, :description, :from_date, :to_date 
    validates_uniqueness_of :code 
    validates_presence_of :code 
    has_many :goal_entries, :primary_key => "code", :foreign_key => "goal_code" 
    accepts_nested_attributes_for :goal_entries 
end 

i GoalEntry:

class GoalEntry < ActiveRecord::Base 
    attr_accessible :code, :goal_code, 
    :general_increase_percentage, :general_net_sales, 
    belongs_to :goal, :primary_key => "code", :foreign_key => "goal_code" 
    validates_presence_of :code 
    validates_presence_of :goal_code 
    validates_uniqueness_of :code , :scope => :goal_code 
    #validates_numericality_of :general_net_sales 

Widok potrzebny do utworzenia/edycji elementu docelowego GoalEntry dla celu rozpoczyna się tak:

<%= form_for([@goal, @goal_entry]) do |f| %> 
<% if @goal_entry.errors.any? %> 
<div id="error_explanation"> 
    <h2><%= pluralize(@goal_entry.errors.count, "error") %> 
     prohibited this goal_entry from being saved: 
    </h2> 
    <ul> 
     <% @goal_entry.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
    </ul> 
</div> 
<% end %> 
<div class="field"> 
    <%= f.hidden_field :goal_code, :required => true%> 
</div> 
<div class="field"> 
    <%= f.label :code %> 
    <%= f.number_field :code, :required => true %> 
</div> 
... 

Metoda aktualizacji wpisów w kontrolerze cel:

def update 
    @goal_entry = GoalEntry.find(params[:id]) 

    respond_to do |format| 
     if @goal_entry.update_attributes(params[:goal_entry]) 
     format.html { redirect_to edit_goal_path(@goal_entry.goal), notice: 'Goal entry was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @goal_entry.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

Wprowadzanie prawidłowych wpisów Goal działa dobrze. Ale czy jest jakiś komunikat o błędzie sprawdzania poprawności otrzymuję następujący komunikat:

**NoMethodError in Goal_entries#update** 
ActionView::Template::Error (undefined method `goal_entry_path' for #<#<Class:0x007fce30a0c160>:0x00000004199570>): 
    1: <%= form_for([@goal, @goal_entry]) do |f| %> 
    2: <% if @goal_entry.errors.any? %> 
    3: <div id="error_explanation"> 
    4: <h2><%= pluralize(@goal_entry.errors.count, "error") %> 
    app/views/goal_entries/_form.html.erb:1:in `_app_views_goal_entries__form_html_erb__827873423371803667_70261777948540' 
    app/views/goal_entries/edit.html.erb:3:in `_app_views_goal_entries_edit_html_erb__779650500016633360_70261777920720' 
    app/controllers/goal_entries_controller.rb:77:in `block (2 levels) in update' 
    app/controllers/goal_entries_controller.rb:72:in `update' 
    etc... 

Czy jest coś złego w <% if @goal_entry.errors.any? %> Będę wdzięczny, jeśli ktoś ma rozwiązanie tego problemu. Dzięki

+2

'niezdefiniowana metoda 'goal_entry_path'' czy jesteś pewien, że w twoich trasach znajduje się ścieżka goal_entry? Jeśli tak, czy możesz opublikować swoją metodę edycji? – Magicmarkker

+0

Czy twoja akcja 'edit' ma następującą wartość:' @goal_entry = GoalEntry.find (params [: id]) '? – MrYoshiji

+1

Czy możesz opublikować, co "trasy rake" wypisuje? – Matt

Odpowiedz

8

Twoja form_for generuje trasę z [@goal, @goal_entry], ale nie zdefiniowałeś @goal w akcji aktualizacji.

Spróbuj dodać @goal = Goal.find(params[:goal_id]) do swojej metody aktualizacji.

+0

Dzięki Delameko! –

+0

Rozwiązałeś mój problem. –

+0

Nadal nie rozumiem, dlaczego wszystko działa poprawnie, gdy nie ma wiadomości sprawdzania poprawności! A wiadomość, którą otrzymałem, jest nieco myląca: mówi ona o niezdefiniowanej "ścieżce celu celu", a nie o "ścieżce celu"? Na pewno czegoś brakuje. –