使用AJAX追加记录?

时间:2014-03-16 19:47:38

标签: jquery ruby-on-rails ajax

index.html.erb中,我有一个AJAX表单:

<%= form_for @todo, :remote => true do |f| %>
  <%= f.label :name %> <%= f.text_field :name%>
  <%= f.hidden_field :done, :value => false %>
  <%= f.hidden_field :user, :value => current_user.email %>
  <%= f.submit "Add to todo list" %>
<% end %>

当我使用它提交内容时,我发现它们应该出现在我的索引页面上。但是,我现在正试图让最新添加的元素瞬间出现。

所以我做了create.js.erb

<% if @todo.valid? %>
    $(".todos").append('<li><%= @todo.name %></li>');
    console.log("in here");
<% else %> 
    // Flash message below!
    alert('Something went wrong!');
<% end %>

但由于某种原因,我无法立即看到记录被添加?我从未看到上面的console.logalert消息,这意味着它永远不会执行该代码段。发生了什么事?

此外,这可能与表单提交相关,我看到:GET http://localhost:3000/todos 500 (Internal Server Error)

以下是相关路线

                root GET    /                              home#index
               todos GET    /todos(.:format)               todos#index
                     POST   /todos(.:format)               todos#create
            new_todo GET    /todos/new(.:format)           todos#new
           edit_todo GET    /todos/:id/edit(.:format)      todos#edit
                todo GET    /todos/:id(.:format)           todos#show

在控制器中:

class TodosController < ApplicationController
    def index
        @todo = Todo.new
        @todos = Todo.where(done:false)
    end
def todo_params
    params.require(:todo).permit(:name, :done, :user)
end
def create
    @todo = Todo.new(todo_params)
    if @todo.save
        redirect_to todos_path, :notice => "Your todo item was created!"
    else
        render "new"
    end
end
end

2 个答案:

答案 0 :(得分:1)

可能的实例变量名称错误?

create.js.erb文件中尝试使用<li><%= @todo.name %></li>代替<li><%= @track.name %></li>

另一个细节:在允许的参数(todo_params)中,我认为您需要使用:user_id而不是:user

此外,如果要处理redirect_to模板,则在保存实例后不必使用js.erb,因此您的控制器应为远程提交发送js响应,像(与html响应相结合):

def create
  @todo = Todo.new(todo_params)

  respond_to do |format|
    if @todo.save
      format.html { redirect_to todos_path, notice: 'Your todo item was created!' }
      format.js
    else
      format.html { redirect_to todos_path, notice: 'Something was wrong!' }
      format.js
    end
  end
end

答案 1 :(得分:1)

尝试将您的创建方法更改为以下内容:

def create
    @todo = Todo.new(todo_params)

    respond_to do |format|
        if @todo.save
            format.js
        else
            render "new"
        end
    end
end

长话短说:您的控制器不会被告知要呈现javascript,因此它会返回&#t; todos_path&#39; - 没有定义路线。如果你告诉它渲染js,它默认会查找methodname.js.erb。通过上面的更改,它应该正确返回javascript。