验证失败后,Rails AJAX表单不会重新填充字段

时间:2019-02-01 18:21:25

标签: ruby-on-rails ruby ajax

我有一个while(1) { ADCON0 = 0b10000011; // select channel and start AD conversion cycle __delay_ms(10); A = ((ADRESH <<8)+ ADRESL); for(i=(1<<9);i!=0;i>>=1) { // controlla i singoli bit if ((j & i) == 1) { // se = 1, manda un segnale sul canale GP5 GPIObits.GP5 = 1; __delay_ms(250); GPIObits.GP5 = 0; __delay_ms(250); } if ((j & i) == 0) { // se = 1, manda un segnale sul canale GP4 GPIObits.GP4 = 1; __delay_ms(250); GPIObits.GP4 = 0; __delay_ms(250); } __delay_ms(1000); } } gem的Rails 5.2.0应用程序。在下面的设置中,我将使用AJAX表单创建一个新的simple_form。我可以创建一个新记录。

但是,当表单验证失败(标题和正文属性)时,它将重新呈现Note部分,但不会用用户提交表单之前存在的数据填充表单字段。

验证失败后如何保存数据?

_new.html.erb

book.rb

class Book < ApplicationRecord has_many :notes end

note.rb

class Note < ApplicationRecord belongs_to :book validates :title, :body, presence: true end

notes_controller.rb

def new @note = Note.new @book = Book.find(params[:book_id]) respond_to do |format| format.html {} format.js {} end end def create @book = Book.find(params[:book_id]) @note = @book.notes.create(note_params) if @note.save respond_to do |format| format.html { redirect_to user_book_path(id: @book.id, user_id: current_user.slug) } format.js { redirect_to user_book_path(id: @book.id, user_id: current_user.slug) } end else respond_to do |format| format.html { render :new } format.js {render :new} end end end

_new.html.erb

<%= simple_form_for [book, Note.new], remote: true do |f| %> <%= f.input :title, placeholder: "title", label: false, autofocus: true %> <%= f.input :body, placeholder: "title", label: false, autofocus: true %> <%= f.button :submit, "Create note" %> <% end %>

new.js.erb

1 个答案:

答案 0 :(得分:3)

我猜测问题在于您在此处使用Note.new

<%= simple_form_for [book, Note.new], remote: true do |f| %>
  <%= f.input :title, placeholder: "title", label: false, autofocus: true %>
  <%= f.input :body, placeholder: "title", label: false, autofocus: true %>
  <%= f.button :submit, "Create note" %>
<% end %>

因此,表单中永远不会有任何值,因为表单始终基于新的Note对象。

由于您同时在@notenew操作中实例化了create,所以我相信您应该这样做:

<%= simple_form_for [book, @note], remote: true do |f| %>
  <%= f.input :title, placeholder: "title", label: false, autofocus: true %>
  <%= f.input :body, placeholder: "title", label: false, autofocus: true %>
  <%= f.button :submit, "Create note" %>
<% end %>

我不使用simple_form,所以它是在黑暗中拍摄的。

另外,正如约翰·加拉格尔(John Gallagher)在评论中指出的那样:

@note = @book.notes.create(note_params)

真的应该是这样:

@note = @book.notes.build(note_params)

实例化诸如@note之类的内容时,通常使用.build代替.create,因为.build不会保存@note从而使{{1 }}有条件的多一些。