我已经按照Railscast关于通过Ajax提交表单并更新div而不重新加载页面,但我遇到了一部分问题。
Ryan在$("#products").html("<%= escape_javascript(render(@products)) %>");
文件中有index.js.erb
,用于在提交表单时更新#products
div。我很难理解像@products
这样的实例变量是否与我的情况相关,或者我是否可以简单地将其替换为URL。
我正在尝试在此截屏视频中执行与Ryan相同的操作,但不是显示搜索结果,而只是想显示更新的值。
在show.html.erb中我有:
<% @project.project_todos.order("created_at DESC").where(:status => false).each do |todo|%>
<%= form_for todo, :remote => true, :"data-replace" => "#dueon" do |f| %>
<%= f.text_field :due %>
<%= f.submit :class => "primary", :value => "Add" %>
<% end %>
<div id="dueon">
<%= render "duedate", :todo => todo %>
</div>
<% end %>
部分_duedate.html.erb
中有一行:<%= todo.due %>
所以在我的index.js.erb中,我目前有这个:$("#dueon").html("<%= escape_javascript(render("_duedate")) %>");
但它显然不起作用。我是否必须在此处使用变量代替_duedate
?如果是这样,我将如何在控制器中设置它?我的意思是变量代表了什么?
此外,对于它的价值,部分正确呈现并显示todo.due
值...当我提交表单时它不会更新。
ProjectsController:
def show
@project = Project.find(params[:id])
# Display the form to create a new todo
@project_todo = ProjectTodo.new
respond_to do |format|
format.html # show.html.erb
format.json { render :json => @project }
end
end
答案 0 :(得分:5)
试试这个
在你的控制器动作中,(比如sample_action)
def sample_action
@todos = #your code
respond_to do |format|
format.js
end
end
你有一个sample_action.js.erb
$("#dueon").html("<%= raw escape_javascript(render(:partial => 'duedate')) %>")
然后在partial中,您可以访问新的@todos
实例变量
HTH
答案 1 :(得分:0)
我会单独回答你,因为我相信你的整个设置应该没什么变化(IMO,可能不是这样)
我认为你应该有一个属于它的项目的待机控制器,
---模特----------------
class Project < ActiveRecord::Base
has_many :todos
end
class Todo < ActiveRecord::Base
belongs_to :project
end
----路线---------------
resources :projects do
resources :todos do
end
end
----控制器----------
类ProjectsController&lt; ApplicationController中
端
class TodosController < ApplicationController
def new
@project = Project.find(params[:project_id])
@todos = @project.todos.build
end
end
在您的视图中(views / todos.html.erb)
<%= @project.name %>
<%= form_for([@Project, @todos]) do |f| %>
#todo form code
<% end%>
根据关系,项目有许多待办事项,它总是清楚地显示在todo添加屏幕中的项目细节,而不是允许用户从项目屏幕添加新的待办事项。
再次,这是我个人观点,随时提出任何问题:)