0

如果我将输入框留空。我每次都收到这个错误。我不希望它在空白时创造新记录。如果没有,我希望它创造新的记录。

这个输入框是嵌套的,控制器的代码是这样写的,以免出错

  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
4

3 回答 3

1

你必须设置

@girl = Girl.new

在你的 else 块内,就在之前

format.html { render action: "new" }

发生错误是因为您渲染了新模板,并且在其中 form_for(@girl) 获得了一个 nil 对象 - @girl。为了呈现该行<%= f.label :mail %><br />,它尝试在给定的@girl 对象上调用 mail 方法以获取其默认值。由于 @girl 对象是 nil 并且在渲染新模板之前未在 create 操作中设置,因此您会收到此错误。

更新:

我在这篇文章的第一部分的答案中误解了你的情况。我认为的解决方案是重定向到新的女孩路径,而不是仅仅渲染新的动作。渲染只渲染视图重定向将进行全栈请求过程。假设您设置了路线 new_girl_path ,您应该替换format.html { render action: "new" }

format.html { redirect_to new_girl_path }

您可以运行`rake routes并查看您设置了哪些命名路由。

于 2012-07-13T06:32:36.217 回答
1

我的问题是以下几行代码。

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| %>
于 2012-07-13T07:02:01.443 回答
0

将同一行代码替换为
<%= form_for( :girl, :url => {:action => :create}) do |f| %>

于 2012-07-13T06:40:52.023 回答