单击按钮时如何在Rails中存储新条目?

时间:2012-10-26 22:11:30

标签: ruby-on-rails

我的一个模型中有一个方法,在调用时,使用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

2 个答案:

答案 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