我正在尝试使用after_commit方法将参数从帖子传递到用户模型,然后使用其他方法将参数传递给twitter。
当我从帖子模型中传递一些内容时,它可以正常工作,例如'title'或'content':
after_commit :share_all
def share_all
if user.authentications.where(:provider => 'twitter').any?
user.twitter_share(title, content)
end
end
def twitter_share(title, content)
twitter.update("#{title}, #{content}")
end
但就我的理解而言,我已经在其他地方读到我可以通过'自我'代替'标题'和'内容',并且仍然可以使用'标题'和'内容'加上任何来自模型的其他东西,例如'created_at'。但是,我似乎无法让这个工作,我试过这个:
def share_all
if user.authentications.where(:provider => 'twitter').any?
user.twitter_share(self)
end
end
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上分享?
编辑:
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
答案 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