Rails问题 - 在验证期间显示错误

时间:2013-09-02 19:09:47

标签: ruby-on-rails validation ruby-on-rails-4 activemodel

在我的Rails 4应用中,我有两个模型 - usersaccommodationsUsers有许多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

1 个答案:

答案 0 :(得分:2)

在控制器的new方法中,您应该使用current_user.accommodations.build而不是accommodation.new,因为您需要用户的新住宿(适应用户)。当我们有这种关系时,请记住.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页面?

在这种情况下,您应该向住宿控制人员添加索引操作:

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.erb@accommodations,并显示您需要的信息......