Добавление ajax в Rails 3 form_for - PullRequest
0 голосов
/ 18 октября 2011

Я учусь программировать, и в моем приложении на Rails 3 запущена форма. Сейчас я пытаюсь добавить ajax в форму, чтобы страница не перезагружалась после отправки.

Я следовал многочисленным урокам, но не могу понять, как их собрать. Форма добавляет новый Objects к Profile через следующую модель:

class Profile < ActiveRecord::Base
  has_many :objects
end

class Object < ActiveRecord::Base
  belongs_to :profile
end

Моя форма в views/profiles/_object_form.html.erb:

<%= form_for(@object, :remote => true) do |f| %>
<% end %>

Где форма и ее созданные объекты отображаются в моем views/profiles/_about.html.erb:

<div id="newObjects">
  <%= render :partial => 'object_form' %>
</div>
<div id="objectList">
  <%= render :partial => 'object', :collection => @profile.objects, :locals => {:object_count => @profile.objects.length) %>
</div>

В моем objects_controller.rb есть следующее действие создания:

def create
  @object = Object.new(params[:object].merge(:author_id => current_user.id))
  respond_to do |format|
    if @object.save!
      format.html {redirect_to profile_path(@object.profile) }
      format.js { render }
    else
      format.html { redirect_to @profile, :alert => 'Unable to add object' }
    end
  end
end

В views/objects/create.js.erb:

$('#objectList').append("<%= escape_javascript(render @profile.object)) %>");

Итак, у меня есть форма, вызывающая действие в другом контроллере, к которому я хочу добавить ajax. На данный момент происходит то, что мне нужно перезагрузить профиль, чтобы показать вновь созданный объект. Что я делаю не так?

ПОЯСНЕНИЕ: Кроме действия create в ObjectsController, я ссылаюсь на @object только один раз в другом месте. Это в действии showsController:

def show
  @profile = Profile.find(params[:id])
  @superlative = @profile.superlatives.new`
end

1 Ответ

0 голосов
/ 18 октября 2011

Не уверен, что это полный фрагмент кода для вашего действия create, но похоже, что вы пытаетесь вызвать render для переменной экземпляра, которая не существует ... @profile никогда не устанавливается в методе create в ObjectController ...

Возможно, вы хотели набрать $('#objectList').append("<%= escape_javascript(render @object)) %>");

Также заметил, что в вашем существующем коде вы вызываете render @profile.object, но класс Profile имеет отношение has_many с вашим классом Object, поэтому, если это был правильный код, вы должны набрать render @profile.objects (множественное число, не единственное число).

Но я думаю, вы, вероятно, захотите код, который я упомянул выше, поскольку вы добавляете в список объектов, а не визуализируете список снова?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...