创建新对象而不重定向到rails中的new_xxx_path

时间:2012-02-21 09:01:59

标签: jquery ruby-on-rails ajax ruby-on-rails-3

我跟踪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我该如何解决?感谢

1 个答案:

答案 0 :(得分:2)

有关使用Ajax调用控制器方法的演示,请参阅此文章,因此您无需重定向到新路径。

Rails 3 form_for ajax call

希望这对你有所帮助。

编辑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相关目录中,其中包含以下内容:

create.js.erb

$('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 %>