Form_for不适用于JS / JQuery

时间:2014-07-21 14:19:13

标签: javascript jquery ruby-on-rails ruby form-for

当我使用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> 

我希望我能够解释自己在这里得到一些帮助。我试了几个小时自己找到问题的解决方案,并在这里寻找类似的问题而没有找到任何东西,没有得到任何地方。

1 个答案:

答案 0 :(得分:0)

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

所以我将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。