Rails:如何使用after_commit方法从模型传递参数,最终在twitter上共享

时间:2011-04-15 21:00:54

标签: ruby-on-rails ruby-on-rails-3 activerecord parameter-passing

我正在尝试使用after_commit方法将参数从帖子传递到用户模型,然后使用其他方法将参数传递给twitter。

当我从帖子模型中传递一些内容时,它可以正常工作,例如'title'或'content':

post.rb

after_commit :share_all

def share_all
 if user.authentications.where(:provider => 'twitter').any?
    user.twitter_share(title, content)
 end
end

user.rb

def twitter_share(title, content) 
  twitter.update("#{title}, #{content}")
end

但就我的理解而言,我已经在其他地方读到我可以通过'自我'代替'标题'和'内容',并且仍然可以使用'标题'和'内容'加上任何来自模型的其他东西,例如'created_at'。但是,我似乎无法让这个工作,我试过这个:

post.rb

def share_all
 if user.authentications.where(:provider => 'twitter').any?
    user.twitter_share(self)
 end
end

user.rb

def twitter_share(self) 
  twitter.update("#{title}, #{content}")
end

我得到SyntaxError(/Users/ihal/Desktop/dayor/app/models/user.rb:118:语法错误,意外的keyword_self,期待')' def twitter_share(self)

并将其发布到twitter#<交:0x00000101d6e1e0>

我的问题是如何正确设置传递'self'以便可以使用twitter.update()调用任何参数?

另外,您如何为该帖子提取网址,以便您可以通过该网址在Twitter上分享?

编辑:

尝试Rails.application.routes.url_helpers.post_url(@ post,:host =>'myhost.com')

post.rb中的

 class Post < ActiveRecord::Base  # line 19

 after_commit :share_all

 Rails.application.routes.url_helpers.post_url(@post, :host => 'myhost.com')    #line 37

 def share_all
 if user.authentications.where(:provider => 'twitter').any?
    user.twitter_share(self)
 end
end

当我去删帖时,我收到错误:

在2011-04-15 14:57:17 -0700开始发布“/ posts / 32”for 127.0.0.1   由PostsController处理#destroy作为HTML   参数:{“authenticity_token”=&gt;“x8KkqLLCLdTOouUfCMzyWWmwxLIKThnE1n3rQNSkew8 =”,“id”=&gt;“32”}   用户负载(1.1ms)SELECT“users”。* FROM“users”WHERE(“users”。“id”= 5)LIMIT 1 在82ms完成

ActionController :: RoutingError(没有路由匹配{:action =&gt;“destroy”,:controller =&gt;“posts”}):   app / models / post.rb:37:in <class:Post>' app/models/post.rb:19:in'   app / controllers / posts_controller.rb:36:在`authorized_user'

在救援/布局中呈现/Users/ihal/.rvm/gems/ruby-1.9.2-p136@rails3gemset/gems/actionpack-3.0.1/lib/action_dispatch/middleware/templates/rescues/routing_error.erb( 1.2ms的)

帖子控制器

def destroy
  @post.destroy
  redirect_to root_path
end


private
   def authorized_user
   @post = Post.find(params[:id])   #line 36
     redirect_to root_path unless current_user?(@spost.user)
   end
end

3 个答案:

答案 0 :(得分:2)

您是否考虑过使用Observer?这样你就可以将after_commit的东西保存在适当的位置,这些东西似乎不属于模型。此外,它有助于简化您的模型而不是混乱。

对于语法错误,self是保留字。在方法声明中重命名变量名称。所以尝试类似的事情:

def twitter_share(post)
  # do stuff
end

要访问控制器外部的网址助手,请使用:

Rails.application.routes.url_helpers.post_url(@post, :host => 'myhost.com') 

在访问控制器外部的url帮助程序时,不要忘记使用:host选项,以便帮助程序具有上下文。

答案 1 :(得分:0)

def twitter_share(post) 
  twitter.update("#{post.title}, #{post.content}")
end

您正在将帖子传递给user.twitter_share方法。

答案 2 :(得分:0)

我在代码中看到的是,标题和内容是Post的属性。所以将它们作为theire名称传递将转换为它们的值。

现在你在twitter_share中传递self,然后post对象将被传递给该方法。你需要修改twitter_share方法,如下所示,使其工作

def twitter_share(post)
 twitter.update("#{post.title}, #{post.content}")
end