отправка сообщений с разных страниц в рельсах - PullRequest
0 голосов
/ 08 ноября 2010

У меня есть приложение, которое позволяет пользователям оставлять комментарии в своих профилях (например, на стене Facebook).

На данный момент пользователи могут отправлять комментарии только с домашней страницы, которая создает новый «комментарий», а также новое «событие» для потока действий. Затем поток активности обновляется через AJAX.

Однако я хочу, чтобы пользователи также могли отправлять новый комментарий прямо со страницы своего профиля. Есть ли способ заставить рельсы определять, на какой странице они находятся? Домашнюю страницу (которая является контроллером: home, action: index) или страницу профиля (controller: пользователь, action: show) и в зависимости от выполнения соответствующих действий ajax? Вот мой код:

для формы комментария:

<% form_remote_for Comment.new do |f| %>
    <%= f.text_area :message, :value => "create a new comment...", :onfocus => "this.value=''" %>
    <%= f.submit "post comment", :disable_with => 'posting', :class => 'button' %>
<% end %>

и мой контроллер комментариев:

def create
    comment = current_user.comment.create(params[:comment])
    comment.save!
    event = comment.user.events.create
    event.kind = "comment"
    event.data = { "message" => "#{comment.message}" }
    event.save!
    @user_stream = current_user.stream.paginate :page => params[:page], :order => "created_at desc"
    render :update do |page|
        page.insert_html :top, "stream", :partial => "home/new_comment_event", :locals => { :comment => comment }
        page["comment_message"].clear
  end
end

Я хочу, чтобы публикация комментариев со страницы профиля была идентичной, за исключением того, что ajax будет:

render :update do |page|
    page.insert_html :top, "profile", :partial => "home/new_comment", :locals => { :comment => comment }
    page["comment_message"].clear
end

Могу ли я использовать рельсы, чтобы определить, откуда поступает этот новый комментарий, и правильно обслуживать ajax?

Я думаю что-то вроде:

render :update do |page|
  if page['stream']
    page.insert_html :top, "stream", :partial => "home/new_comment_event", :locals => { :comment => comment }
    page["comment_message"].clear
  else
    page.insert_html :top, "stream", :partial => "home/new_comment_event", :locals => { :comment => comment }
        page["comment_message"].clear

  end
    end

или

render :update do |page|
  if page.select('ul#stream').any?
    page.insert_html :top, "stream", :partial => "home/new_comment_event", :locals => { :comment => comment }
    page["comment_message"].clear
  else
    page.insert_html :top, "comment_list", :partial => "home/new_comment", :locals => { :comment => comment }
        page["comment_message"].clear

  end
    end

Я также пытался использовать скрытый тег поля только в комментариях к профилю, в форме и в request.request_uri, но ни один из них не сработал. Я бы не стал добавлять другой элемент в модель комментариев, чтобы различать место происхождения.

Но ни один из них, похоже, не работает, поэтому я не знаю, что делать.

Спасибо!

Ответы [ 2 ]

1 голос
/ 08 ноября 2010

Вы должны быть в состоянии определить источник запроса в контроллере, используя

request.request_uri
1 голос
/ 08 ноября 2010

Есть ли другое поведение, связанное с тем, откуда оно взято?Из приведенного выше примера кажется, что он выполняет одинаковые действия в блоках if и else.

При этом нет причин, по которым вы не можете передать другую переменную для поездки, чтобы определить, где она находится.например, params[:from], а затем проверьте это при рендеринге вашего частичного.

...