在我的Rails 4应用中,我有两个模型 - users
和accommodations
。 Users
有许多accommodations
,并且已在相关模型中设置(即belongs_to
,has_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
答案 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
,并显示您需要的信息......