[英]How to avoid the error undefined method 'mail' for nil:NilClass
如果我将输入框留空。 我每次都会收到这个错误。 当它空白时,我不希望它创造新记录。 什么时候不想,我想让它创造新纪录。
这个输入框是嵌套的,控制器的代码是这样写的,以避免错误
def create
# Check if there is any contact info added
if params[:girl][:contact_attributes][:mail].empty?
params[:girl].delete(:contact_attributes)
end
@girl = Girl.new(params[:girl])
respond_to do |format|
if @girl.save
format.html { redirect_to @girl, notice: 'Girl was successfully created.' }
format.json { render json: @girl, status: :created, location: @girl }
else
format.html { render action: "new" }
format.json { render json: @girl.errors, status: :unprocessable_entity }
end
end
end
视图是这样的
<%= form_for(@girl) do |f| %>
....
<div class="field">
<%= f.label :mail %><br />
<%= f.fields_for :contact_attributes, @girl.contact do |contact| %>
<%= contact.text_field :mail %>
<% end %>
</div>
....
<div class="actions">
<%= f.submit %>
</div>
<% end %>
我的模特
class Girl < ActiveRecord::Base
has_many :users
has_one :contact
accepts_nested_attributes_for :contact
attr_accessible :id, :name_en, :name_ja, :gender_id, :contact_attributes, :photo, :tag_list
searchable do
text :name_en, :name_ja
text :contact do
contact.mail
end
end
has_attached_file :photo,
:styles => {
:thumb=> "100x100>",
:small => "400x400>" }
acts_as_taggable_on :tags
acts_as_commentable
end
你必须设置
@girl = Girl.new
在你的其他街区内,就在之前
format.html { render action: "new" }
发生错误是因为你渲染了新模板,而在其中,form_for(@girl)获得了一个零对象 - @girl。 为了呈现行<%= f.label :mail %><br />
它尝试在给定的@girl对象上调用mail方法以获取其默认值。 由于@girl对象为nil,并且在呈现新模板之前未在创建操作中设置,因此会出现此错误。
更新:
我在这篇文章的第一部分的答案中误解了你的情况。 我认为解决方案是重定向到新的女孩路径,而不是仅仅渲染新的动作。 渲染时只渲染视图重定向将进行全栈请求过程。 假设你设置了路径new_girl_path,你应该用format.html替换format.html format.html { render action: "new" }
format.html { redirect_to new_girl_path }
您可以运行`rake routes
并查看已设置的命名路由。
我的问题是以下几行代码。
if params[:girl][:contact_attributes][:mail].empty?
params[:girl].delete(:contact_attributes)
end
如果用户联系人中的邮件为空,则表示您已删除联系人属性并仅创建用户对象。
所以,如果你打电话给@ girl.contact,你会得到零。
我不知道为什么你删除了联系人属性。如果你还想这样做,你需要再添加一行。
if @girl.save
format.html { redirect_to @girl, notice: 'Girl was successfully created.' }
format.json { render json: @girl, status: :created, location: @girl }
else
#Assuming you have the association like: user has_one contact
@user.build_contact
format.html { render action: "new" }
format.json { render json: @girl.errors, status: :unprocessable_entity }
end
还有一件事
<%= f.fields_for :contact_attributes, @girl.contact do |contact| %>
可以简单地写成
<%= f.fields_for :contact do |contact| %>
用。替换相同的代码行
<%= form_for( :girl, :url => {:action => :create}) do |f| %>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.