1

在我的 Rails 4 应用程序中,我有两个模型 -usersaccommodations. 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

但是在我的 AccommodationsController #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,因为您想要一个用户的新住宿(住宿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方法中,我认为如果出现错误你会渲染new,否则如果创建成功你重定向到accommodations#index页面?

在这种情况下,您应该将 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 回答