2

非常によく似た問題について 20 以上の StackOverflow の記事 (および Web 上の他の多くの記事) を読み、それらの解決策を試しましたが、どれもうまくいきませんでした。この初心者を助けてください!

特に、私が最も頻繁に見つけた解決策は

form_for [@parent, @child] do |f|

しかし、他の人が行ったようにエラーを修正することはありません。

エラー:

エラーは localhost:3000/locations/1/restaurants/new で発生します

レストランでの NoMethodError#new

/app/views/restaurants/_form.html.erb の 1 行目を表示:

undefined method `restaurants_path' for #<#<Class:0x007fb7ab89ea80>:0x007fb7aaadc3c0>

抽出されたソース (行 #1 付近):

1: <%= form_for [@location, @restaurant] do |f| %>
2:   <% if @restaurant.errors.any? %>
3:     <div id="error_explanation">
4:       <h2><%= pluralize(@restaurant.errors.count, "error") %> prohibited this restaurant from being saved:</h2> 

アプリ コードのいずれにもrestaurants_pathに関する言及が見つからないため、これは魔法の Rails のデフォルトであると想定しています。

コード:

has_many/belongs_toモデルを使用しています: 場所に多くのレストランがあります。

config/routes.rb

  resources :locations do
    resources :restaurants
  end

$レーキルート

location_restaurants GET    /locations/:location_id/restaurants(.:format)          restaurants#index
                         POST   /locations/:location_id/restaurants(.:format)          restaurants#create
new_location_restaurant GET    /locations/:location_id/restaurants/new(.:format)      restaurants#new
edit_location_restaurant GET    /locations/:location_id/restaurants/:id/edit(.:format) restaurants#edit
location_restaurant GET    /locations/:location_id/restaurants/:id(.:format)      restaurants#show
                         PUT    /locations/:location_id/restaurants/:id(.:format)      restaurants#update
                         DELETE /locations/:location_id/restaurants/:id(.:format)      restaurants#destroy

app/controllers/restaurants_controller.rb

  def new
    @restaurant = Restaurant.new

    respond_to do |format|
      format.html
      format.json { render json: @restaurant }
    end
  end

  def edit
    @restaurant = Restaurant.find(params[:id])
  end

  def create
    @location = Location.find(params[:location_id])
    @restaurant = @location.restaurants.create(params[:restaurant])

    respond_to do |format|
      if @restaurant.save
    format.html { redirect_to location_restaurants_path(@location), notice: 'Restaurant was successfully created.' }
        format.json { render json: @restaurant, status: :created, location: @restaurant }
      else
        format.html { render action: "new" }
        format.json { render json: @restaurant.errors, status: :unprocessable_entity }
      end
    end
  end
4

2 に答える 2

1

フォームに必要な を初期化していません@location( の行form_for [@location, @restaurant])。Location.find( を使用して)検索する行をアクションに追加し、その場所に関連付けられるようにnewビルドします。@restaurant

def new
  @location = Location.find(params[:location_id])
  @restaurant = @location.restaurants.build
  ...

end

@locationすべてのアクションが必要になるため (edit現在のコードでも動作していないと思われる を含む)、それを別のメソッドに入れてから呼び出すのが理にかなっていますbefore_filter

before_filter :find_location

private

def find_location
  @location = Location.find(params[:location_id])
end

create次に、アクション内(およびアクションから)の場所を見つける行を削除することもできますnew

于 2012-11-29T05:53:18.767 に答える
0

問題は、アクション@restaurantで変数をインスタンス化する方法だと思います。newロケーションの下にネストされているため、次のようにビルドする必要があります。

@location = Location.find(params[:location_id]) @restaurant = @location.restaurants.new

于 2012-11-29T05:57:35.727 に答える