Обновление нескольких divs с RJS / AJAX - PullRequest
0 голосов
/ 21 мая 2010

Я успешно использую RJS для реализации AJAX на page.replace.html create.js.rjs. Я пытаюсь обновить два местоположения вместо одного и после просмотра Райан Бейтс Railscast Я очень близок (я думаю), но у меня есть проблема в синтаксисе моего файла /views/likes/create.js.rjs , Вот ситуация:

, расположенный по адресу /views/likes/create.js.rjs, имеет следующий код:

page.replace_html  "votes_#{ @site.id }", :partial => @like
page.replace_html  "counter", 10 - (@question.likes.count :conditions => {:user_id => current_user.id})
page[@like].visual_effect :highlight

Моя проблема заключается во второй строке. Div "counter" отображает следующий код на странице /views/question/show.html.erb:

    <div id="counter">
        You have <%= 10 - (@question.likes.count :conditions => {:user_id => current_user.id}) %> votes remaining for this question
    </div>

После просмотра скриншота я считаю, что моя ошибка связана с синтаксисом второй строки. В частности, он упоминает, что вы не можете использовать локальную переменную экземпляра, но не знаете, как внести изменения. Мысли?

ОБНОВЛЕНИЕ: Вот ошибка, которую я получаю:

ActionView::TemplateError (undefined method `likes' for nil:NilClass) on line #2 of app/views/likes/create.js.rjs:
1: page.replace_html  "votes_#{ @site.id }", :partial => @like
2: page.replace_html  "counter", 10 - (@question.likes.count :conditions => {:user_id => current_user.id})
3: page[@like].visual_effect :highlight

    app/views/likes/create.js.rjs:2:in `_run_rjs_app47views47likes47create46js46rjs'
    app/views/likes/create.js.rjs:1:in `_run_rjs_app47views47likes47create46js46rjs'
    app/controllers/likes_controller.rb:8:in `create'

Rendered rescues/_trace (103.8ms)
Rendered rescues/_request_and_response (0.4ms)
Rendering rescues/layout (internal_server_error)

UPDATE:

класс LikesController

  def create
    @user = current_user
    @site = Site.find(params[:site_id])
    @like = @site.likes.create!(params[:like].merge(:user_id => @user.id))

    respond_to do |format|
     format.html { redirect_to @site}
     format.js
     end
  end
end

ОБНОВЛЕНИЕ: вот форма лайков:

    <% remote_form_for [site, Like.new] do |f| %>
    <%= f.hidden_field :site_name, :value => "#{site.name}" %>
    <%= f.hidden_field :question_id, :value => @question.id %> 
    <%= f.hidden_field :ip_address, :value => "#{request.remote_ip}" %>
    <%= f.hidden_field :like, :value => "1" %>
    <%= submit_tag "^" , :class => 'voteup' %>
<% end %>

Ответы [ 3 ]

2 голосов
/ 22 мая 2010

Попробуйте получить @question вот так, поскольку ваш question_id будет присутствовать внутри params [: like] hash

 @question = Question.find params[:like][:question_id]

В любом случае, для двойной проверки напечатайте ваши параметры, как это, поэтому добавьте оператор put в действие create Like_controller.

puts params.inspect,params[:like][:question_id]

У вас есть эта ошибка (неопределенный метод «лайки» для nil: NilClass) в строке # 2

Это означает, что ваш @question равен nil, вы никогда не объявляли этот экземпляр в действии create.

Надеюсь, это работает для вас.

0 голосов
/ 21 мая 2010

В контроллер нужно загрузить @question переменную.

0 голосов
/ 21 мая 2010

Вы получаете @question = ноль. Вы должны проверить, что @question равен nil или @ question.likes.count = 0, и если это так, вы должны сделать (10-0), т.е.

if //your condition here 
  page.replace_html  "counter", "You have 10 votes remaining for this question"
else 
  page.replace_html  "counter", 10 - (@question.likes.count :conditions => {:user_id => current_user.id})

OR

remaining_votes= (@question && !@question.likes.blank && @question.likes.count :conditions => {:user_id => current_user.id} !=0 )? @question.likes.count :conditions => {:user_id => current_user.id} : 0
page.replace_html  "counter", "You have #{10-remaining_votes } votes remaining for this question"
...