我跟踪Rails 3 form_for ajax call帖子在rails中创建新的event_criteria_option对象,而不重定向到new_event_criteria_option_path。我想直接将表单放在页面中而不重定向到新路径。我想将它放在事件/显示视图中,我的关系是事件has_many:event_criterias,Event_criterias has_many:event_criteria选项。
编辑2:
这是我的控制者:
def create
@event_criteria_option = EventCriteriaOption.new(params[:event_criteria_option])
respond_to do |format|
if @event_criteria_option.save
flash[:notice] = "Event criteria option successfully created"
format.html { redirect_to(event_criteria_path(EventCriteria.find(@event_criteria_option.event_criteria_id)), :notice => 'Event criteria option was successfully created.') }
format.xml { render :xml => @event_criteria_option, :status => :created, :location => @event_criteria_option }
format.js { redirect_to event_path(Event.find(session[:event_id])) }
#render :js => @event_criteria_option, :status => :created, :location => @event_criteria_option, :layout => !request.xhr?
else
format.html { render :action => "new" }
format.xml { render :xml => @event_criteria_option.errors, :status => :unprocessable_entity }
format.js { render :js => @event_criteria_option.errors, :status => :unprocessable_entity }
end
end
端
这是我的观点:
<% if !event_criteria.is_free && !event_criteria.is_exclusive %>
<td>Show options <%= check_box_tag "show_event_criteria_options"+cont.to_s, "event_criteria_options"+cont.to_s, false, :class => "check_buttons" %></td>
<% end %>
</tr>
</table>
<div id="event_criteria_options<%=cont.to_s%>", style="display: none;" >
<% session[:event_id] = @event.id %>
<%= form_for (:event_criteria_option, :remote => true, :url => {:id => 'event_criteria_option_form', :controller => "event_criteria_options", :action => "create", :format => :js}) do |f| %>
<%= f.hidden_field :event_criteria_id, :value => event_criteria.id %>
<%= f.label :value, "Event criteria option value"%>
<%= f.text_field :value %>
<%= f.submit "Add option value", :disable_with => 'Adding option value...'%>
<% end %>
使用此代码,远程表单可以工作并创建event_criteria_option。我还创建了create.js.erb空文件,你的代码更改@value @event_criteria_option会给我一个错误。但问题是,当我按下check_box时,我用jQuery显示远程表单。当它重定向回event / xx路径时,隐藏了event_criteria_options的远程表单,需要再次按复选框以显示它们。你明白吗? jeje我该如何解决?感谢
答案 0 :(得分:2)
有关使用Ajax调用控制器方法的演示,请参阅此文章,因此您无需重定向到新路径。
希望这对你有所帮助。
编辑1:改为使用form_tag
。
<%= form_tag('/event_criteria_options/new', :remote => true, :format => :js) do %>
<%= hidden_field_tag :event_criteria_id, :value => event_criteria.id %>
<%= label_tag :value, "Event criteria option value"%>
<%= text_field_tag :value%>
<%= submit_tag "Add option value", :disable_with => 'Adding option value...'%>
<% end %>
请注意,在表单压缩时刻,您应该能够检索EventCriteria.id
以正确生成表单。
编辑2
尝试将您的操作修改为以下内容:
def new
@event_criteria_id = params[:event_criteria_id]
@value = params[:value]
@event_criteria_option = EventCriteriaOption.create!(:event_criteria_id => @event_criteria_id, :value => @value)
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @event_criteria_option }
format.js { render } # Guess that is something missing here..
end
检查此网址,看看它是否能以任何方式为您提供帮助。 http://www.alfajango.com/blog/rails-3-remote-links-and-forms/
编辑3
由于您正在创建对象,因此只需创建一个带有操作名称的新文件,在本例中create.js.erb
位于views
相关目录中,其中包含以下内容:
$('body').html("<p>New Event Criteria Option created successful! </p>").append("<br /><b><%= escape_javaScript(@value) %></b>");
上面一行将在文档正文中插入一个包含该内容的新段落。但是您可以根据需要随意输出输出。那只是javascript / jQuery。
另一点,如果您正在处理Rails 3,最好开始使用respond_with
您的新create
操作应如下所示:
def new
@event_criteria_id = params[:event_criteria_id]
@value = params[:value]
@event_criteria_option = EventCriteriaOption.create!(:event_criteria_id => @event_criteria_id, :value => @value)
respond_with(@value)
end
在控制器的顶部放置:
class EventCriteriaController < ApplicationController
respond_to :html, :js
def create
.
.
end
end
编辑4
使用会话并创建一个标记来存储是否已选中。
class EventCriteriaController < ApplicationController
respond_to :html, :js
def create
session[:checked] = true
.
.
end
end
然后在您看来,请检查此session[:checked]
视图:
<% if session[:checked] %>
.
.
# code to make your checkbox with check value
<% else %>
# code to make your checkbox unchecked
.
<% end %>