1

Rails 4 アプリには、 と の 2 つのモデルがusersありaccommodationsます。Users多くあり、関連するモデル (つまり、、など)accommodationsに設定されています。宿泊施設モデルに追加されたデータを検証し、エラーがあれば表示しようとしています。belongs_tohas_many

アクションにアクセスしようとするとaccommodations/new、次のエラーが発生します。

NoMethodError in Accommodations#new
undefined method `errors' for nil:NilClass

ユーザーが登録しようとすると、これが機能します。コードは次のとおりです。

users/new.html.erb:

<% if @user.errors.any? %>
    <% @user.errors.full_messages.each do |msg| %>
         <p class="error"><%= msg %></p>
    <% end %>
<% end %>

しかし、宿泊施設で同じことをしようとすると、次のエラーが表示されます。

accommodations/new.html.erb:

<% if @accommodation.errors.any? %>
    <% @accommodation.errors.full_messages.each do |msg| %>
         <p class="error"><%= msg %></p>
    <% end %>
<% end %>

周りを読んだ後、最初のものはこれが原因で機能することに気付きましたUsersController:

def new
  @user = User.new
end

しかし、私の宿泊施設コントローラー #new アクションで次のことを試した後も、まだ機能しません

@accommodation = Accommodation.new

私のAccommodationモデルは次のとおりです。

class Accommodation < ActiveRecord::Base
  belongs_to :user

  validates :user_id, presence: true
  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }

end
4

1 に答える 1

2

newコントローラーのメソッドでは、ユーザーの新しい宿泊施設が必要なため、current_user.accommodations.build代わりに を使用する必要accommodation.newがあります (accomodation belongs_to user)。私たちがこのタイプの関係を持っているとき、代わりに.newなることを覚えておいてください.build

次のようなユーザーと宿泊施設の関係があります。

class User < ActiveRecord::Base

   has_many :accommodations

end

と :

class Accommodation < ActiveRecord::Base

   belongs_to :user

end

次のような新しいメソッドが必要です。

class AccommodationsController < ApplicationControlle
   def new
      @accommodation = current_user.accommodations.build
   end
end

注:ここで current_user はログインしているユーザーです

次に、あなたのcreateメソッドで、エラーが発生した場合は render new、作成が成功した場合はページにリダイレクトすると思いaccommodations#indexますか?

この場合、インデックス アクションを宿泊施設コントローラーに追加する必要があります。

class AccommodationsController < ApplicationControlle

    def index
       # add here what do you need to show, i think you want to show all accomodations, so just add the following line (you can also add pagination if you want later) :
       @accommodations = Accommodation.all
    end

    .
    .
end

最後に、各要素のindex view page : views/accommodation/index.html.erbwhich ループ@accommodationsが必要であり、情報として何が必要かを表示します...

于 2013-09-02T19:49:50.530 に答える