2010-05-21 60 views
0

我成功使用RJS在page.replace.html create.js.rjs上实现AJAX。我试图更新两个位置而不是一个,并在观看后Ryan Bates Railscast我非常接近(我认为),但在我的/views/likes/create.js.rjs文件的语法中存在问题。这里的情况是:更新多个div w/RJS/AJAX

位于/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的“计数器”显示了/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 < ApplicationController的

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 %> 
+0

请粘贴您在此ajax请求上运行的控制器操作中的代码。 – klew 2010-05-21 09:25:29

+0

刚刚添加了喜欢的控制器创建动作...是你在说什么? – bgadoci 2010-05-21 11:32:59

回答

2

尝试让@question这样的,因为你的question_id将存在里面PARAMS [:像]哈希

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

反正双重检查打印PARAMS这样使加放语句创建likes_controller的作用。

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

你有这样的错误(未定义的方法`喜欢的零:NilClass)上线#2

这意味着你的@question是零,你从未宣布过在你创建操作此实例。

希望这对你有用。

+0

好人......完美的工作 – bgadoci 2010-05-23 03:16:37

+0

很高兴听到:)。 – Vamsi 2010-05-23 05:04:45

0

你得到@question = nil。您应该检查@question为零或@ 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 && [email protected] && @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" 
0

在控制器需要加载@question变量。

+0

我只需要添加:'@question = Question.find(params [:question_id])'?或者我还需要在某种程度上影响'@like = @ site.likes.create!(params [:like] .merge(:user_id => @ user.id))? – bgadoci 2010-05-21 17:24:11

+0

是的,它应该像'@question = Question.find(params [:question_id])',但它取决于你当前的'params'哈希,这取决于你的url。如果你的url看起来像这样:'myhost。com/questions/45'然后'question_id'在'params [:id]'中。你的'@ like'代码应该可以工作,但这也取决于。如果你的表格是正确创建的,那么它应该就足够了。 – klew 2010-05-21 18:00:49

+0

我发布了我的表单,因为我无法让您的解决方案正常工作。看到编辑的问题。 – bgadoci 2010-05-21 22:15:59