当点击一个按钮去使用Twitter gem获取推文时,我正试图调用一个方法,并将其存储在我的数据库中。
我有一个名为Sponsor的模型(其中包含一个存储twitter用户名的列)和一个名为Sponsortweet的模型:
模型/ sponsor.rb:
class Sponsor < ActiveRecord::Base
attr_accessible :facebook, :name, :twitter
has_many :sponsortweets, dependent: :destroy
validates :name, presence: true, uniqueness: { case_sensitive: false }
VALID_TWITTER_REGEX = /\A^([a-zA-Z](_?[a-zA-Z0-9]+)*_?|_([a-zA-Z0-9]+_?)*)$/
validates :twitter, format: { with: VALID_TWITTER_REGEX },
uniqueness: { case_sensitive: false }
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
end
模型/ sponsortweet.rb:
class Sponsortweet < ActiveRecord::Base
attr_accessible :content, :from_user, :profile_image_url, :tweet_created_at, :tweet_id
belongs_to :sponsor
validates :content, presence: true
validates :sponsor_id, presence: true
default_scope order: 'sponsortweets.created_at DESC'
end
在controllers / sponsors_controller.rb中:
def tweet
@sponsor = Sponsor.find_by_id(params[:id])
@sponsor.create_tweet
end
我的routes.rb中的相关行:
match 'tweet', to: 'sponsors#tweet', via: :post
在我看来(views / sponsors / show.html.haml):
= button_to :tweet, tweet_path
使用此代码,单击按钮时出现以下错误:
undefined method
create_tweet'for nil:NilClass`
如果我更改为使用find(而不是find_by_id),则错误为:
Couldn't find Sponsor without an ID
...这让我觉得ID没有被传递,因为据我所知,使用find会引发错误,而find_by_id则返回nil。
我应该更改什么才能传递ID?
答案 0 :(得分:2)
您需要使用路径助手传递id
参数:
= button_to :tweet, tweet_path(:id => @sponsor.id)
如果您不想在查询字符串中使用它:
= form_tag tweet_path do |f|
= hidden_field_tag :id => @sponsor.id
= submit_tag "Tweet"
这与您的button_to
完全相同,但会为生成的表单添加隐藏字段。