6

/config/routes.rb でネストされたリソースを定義しました

  resources :goals do
    resources :goal_entries
  end

目標のモデル:

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

および 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

ゴールの親の GoalEntry を作成/編集するビューは、次のように始まります。

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

目標エントリ コントローラの update メソッド:

  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

有効な目標エントリを入力すると問題なく動作します。しかし、検証エラー メッセージがある場合は、次のメッセージが表示されます。

    **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...

誰かがこれに対する解決策を持っていれば、<% if @goal_entry.errors.any? %> 私は感謝します。ありがとう

4

1 に答える 1

8

form_forはからルートを生成して[@goal, @goal_entry]いますが、更新アクションで@goalを定義していません。

@goal = Goal.find(params[:goal_id])updateメソッドに追加してみてください。

于 2012-12-05T16:46:32.417 に答える