Form_for不能与JS/JQuery一起工作

Form_for doesn't work with JS/JQuery

本文关键字:JQuery 一起 工作 JS for 不能 Form      更新时间:2023-09-26

当我使用JavaScript时,我有问题让表单工作。没有远程选项设置为true所有工作正常,但只要我设置它,更改控制器并创建所需的JS文件它生成一个

POST .. 500 Internal Server Error

当点击提交按钮时。

此外,回复预览显示了一个Rails错误页面,上面写着

NoMethodError in Vocabs#createundefined method > for nil:NilClass

中的相关部分(在使用JS之前可以正常工作)

表单(vocabs/_new_form.html.erb)如下所示:

<%= form_for @vocab, remote: true do |f| %>
  <%= render 'fields', f: f %> 
  <%= f.submit "Add", class: "btn btn-large btn-primary" %>
<% end %>    

vocab_controller的创建操作如下:

def create
    @user = current_user
    @vocab = current_user.vocabs.build(vocab_params) 
    @vocabs = @user.vocabs.paginate(page: params[:page])
    respond_to do |format|
        format.html {
            if @vocab.save
                flash.now[:success] = "Vocab created!"
                  redirect_to root_url
            else 
                flash.now[:error] = "Vocab not saved!"              
                render 'new'                
            end
        }
        format.js
    end 
end

create.js.erb如下:

$('#new_vocab').remove();

当然,我想做的不仅仅是删除表单,但由于我甚至没有设法做到这一点,我想保持简单。


_fields.html.erb:

<%= render 'shared/error_messages', object: f.object %> 
<div class="field"> 
<%= f.label :nl_word, @user.native_language %>
<%= f.text_field :nl_word %>
<%= f.label :fl_word, @user.foreign_language %>
<%= f.text_field :fl_word %>
<%= f.label :tag, "Your Tag" %>
<%= f.text_field :tag%>
<%= f.label :importance, "Importance" %>
<%= f.select(:importance, options_for_select(
                StaticData::IMPORTANCE_SEED, :selected => f.object.importance)) %>
</div> 

我希望我能解释得足够好,能得到一些帮助。我自己试了几个小时来寻找问题的解决方案,并在这里寻找类似的问题,但没有找到任何答案,也没有任何进展。

在朋友的帮助下,我发现主要问题是,当用JS处理它时,我没有为我想在表单(_new_form.html.erb)中创建的vocab对象提供任何验证。

所以我改变了vocab_controller。rb

def create
@user = current_user
@vocab = current_user.vocabs.build(vocab_params) 
@vocabs = @user.vocabs.paginate(page: params[:page])
respond_to do |format|
    if @vocab.save
        flash.now[:success] = "Vocab created!"
        format.html do
            redirect_to root_url
        end
        format.js 
    else 
        flash.now[:error] = "Vocab not saved!"
        format.html do
            render 'new'
        end
        format.js 
    end
end 
end

这样做的技巧,我的表单与JS现在工作。