我的一个模型中有一个方法,在调用时,使用twitter gem获取推文并存储它的某些部分。我希望能够从Web界面触发该操作到我的应用程序。什么是Rails实现这一目标的方法?我已经看到一些没有从视图中调用模型方法的引用,所以我应该在控制器内以某种方式这样做吗?
我的方法(相关模型是Sponsor和Sponsortweet(因此我的模型名称不会与来自gem的Tweet冲突):
def create_tweet
tweet = Twitter.user_timeline(self.twitter).first
self.sponsortweets.create!(content: tweet.text,
tweet_id: tweet.id,
tweet_created_at: tweet.created_at,
profile_image_url: tweet.user.profile_image_url,
from_user: tweet.from_user,)
end
编辑:
我在赞助商控制器中创建了tweet
方法:
def tweet
@sponsor = Sponsor.find(params[:id])
@sponsor.create_tweet
end
并将以下内容添加到我的config / routes.rb:match 'tweet', to: 'sponsors#tweet', via: :post
。
以及我视图中的以下代码(我正在使用haml):
= button_to :tweet, tweet_path(@sponsor)
但是,单击该按钮会导致以下错误:
Couldn't find Sponsor without an ID
答案 0 :(得分:1)
您的视图应该有一个按钮,该按钮会发布到控制器中的特定路径。然后该控制器将调用模型中的方法。不知道你的应用实际上是什么样子,这是一个例子:
编辑包含更好的示例
查看(假设它是赞助商视图):
<%= button_to :submit, tweet_path %>
控制器:
def tweet
Sponsor.create_tweet
end
你的模型将保持不变,除非你将方法更改为类方法:
def self.create_tweet
...your code here...
end
由于它似乎与任何特定的赞助商无关,因此您将使用类方法,因此不需要该类的实例来调用您的方法。也就是说,在某些时候你似乎想要一个班级实例......
答案 1 :(得分:0)
我很想听听其他人的回答,因为我现在想知道是否有这样的方法可以全部绕过控制器。
然而,我对此的看法是,由于Rails是一个MVC(模型视图控制器)框架,我认为Rails实现你正在考虑的方法可能只是简单地处理动作;通过控制器到模型。
如果我假设您有一个按钮或链接,或者某些AJAX(正在启动服务器端的Twitter处理),那么我会设置您的路由以指向控制器操作方法,然后会调用您的模型方法myModel.create_tweet
。