ボタンがクリックされたときにメソッドを呼び出して、Twitter gem を使用してツイートをフェッチし、それをデータベースに保存しようとしています。
Sponsor というモデル (Twitter ユーザー名を格納する列を含む) と Sponsortweet というモデルがあります。
モデル/スポンサー.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
モデル/スポンサーツイート.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_by_id の代わりに) find を使用するように変更すると、エラーは次のようになります。
Couldn't find Sponsor without an ID
...私の知る限り、find を使用するとエラーが発生するのに対し、find_by_id は nil を返すため、ID が渡されていないと思います。
ID が渡されるようにするには、何を変更すればよいですか?