Создать новый объект без перенаправления на new_xxx_path в рельсах - PullRequest
1 голос
/ 21 февраля 2012

Я следовал Rails 3 form_for вызова ajax публикация для создания нового объекта event_criteria_option в rails, без перенаправления на new_event_criteria_option_path. Я хочу поместить форму непосредственно на страницу без перенаправления на новый путь. Я хочу поместить ее в представление событий / шоу, и мое отношение - Event has_many: event_criterias, Event_criterias has_many: event_criteria options.

РЕДАКТИРОВАТЬ 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, выдает мне ошибку. Но проблема в том, что я показываю удаленную форму с JQuery, когда я нажимаю флажок. И когда он перенаправляет обратно на путь события / xx, удаленная форма с event_criteria_options скрыта, необходимо снова поставить флажок, чтобы показать их. Вы понимаете? jeje Как я могу решить это? спасибо

1 Ответ

2 голосов
/ 21 февраля 2012

См. Этот пост для демонстрации использования 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

Проверьте этот URL и посмотрите, может ли он вам чем-нибудь помочь. 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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...