如果存在用新数据覆盖,否则在 rails 中创建新行

if exists overwrite with new data else create new row in rails

我正在使用 Ruby 2 和 Rails 4。如果 'name' 不存在,我想创建新数据,如果存在,则用新数据更新。从我的图片来看,如果 'lol' 存在,则在上传时更新新的 pdf 文件,否则使用新数据创建新行。我怎样才能做到这一点?如果有什么想法请与我分享。

我的代码是: Static_pages 控制器:

def create_form
    @form_downup = Contact.new(contact_params)
    if @form_downup.save

      redirect_to :back
    else
      redirect_to downloads_form_path
    end
  end

 private
    def contact_params
       params.require(:contact).permit(:name,:file)

    end

downloads_form.html.erb

<table class="table table-condensed table-responsive">
        <tbody>
            <%= form_tag create_form_path,  multipart: true  do |f| %>
            <tr>                
                <td class=""><%= text_field_tag "contact[name]", nil, class: "form-control" %></td>
                <td><%= file_field_tag "contact[file]",  class: "form-control" %></td>
                <td><%= submit_tag 'Upload' %></td>
                <td><%= link_to "Download", static_pages_downloadform_pdf_path(:file_name => "lol") %></td>

            </tr>

                <% end %> 

        </tbody>
    </table>

我知道这看起来有点难看,但应该可以解决问题

def create_form
  contact = Contact.find_or_initialize_by(name: params[:contact][:name])
  contact.file = params[:contact][:file]

  if contact.save
    redirect_to :back
  else
    redirect_to downloads_form_path
  end
end

您可以使用 find_or_initialize_by.

def create_form
    @form_downup = Contact.find_or_initialize_by(name: params[:contact][:name])
    @form_downup.file = params[:contact][:file]
    if @form_downup.save
      redirect_to :back
    else
      redirect_to downloads_form_path
    end
end

得到解决方案

@form_downup = Contact.find_or_create_by(:name => contact_params[:name])   
@form_downup.file=contact_params[:file]
@form_downup.save