在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.log
或alert
消息,这意味着它永远不会执行该代码段。发生了什么事?
此外,这可能与表单提交相关,我看到: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
答案 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。