Rails: как передать параметры из модели с помощью метода after_commit, чтобы в конечном итоге поделиться в твиттере - PullRequest
2 голосов
/ 16 апреля 2011

Я пытаюсь использовать метод after_commit для передачи параметров из поста в пользовательскую модель, где он используется в твиттере другим методом.

Это прекрасно работает, когда я просто передаю что-то из пост-модели, например, 'title' или 'content':

post.rb

after_commit :share_all

def share_all
 if user.authentications.where(:provider => 'twitter').any?
    user.twitter_share(title, content)
 end
end

user.rb

def twitter_share(title, content) 
  twitter.update("#{title}, #{content}")
end

Но это насколько я понимаю, я читал в другом месте, что я мог бы передать «я» вместо «заголовок» и «контент», и все же иметь возможность использовать «заголовок» и«контент» плюс любая другая вещь из модели, такая как «made_at».Тем не менее, я не могу заставить это работать, я пробовал это:

post.rb

def share_all
 if user.authentications.where(:provider => 'twitter').any?
    user.twitter_share(self)
 end
end

user.rb

def twitter_share(self) 
  twitter.update("#{title}, #{content}")
end

И яget SyntaxError (/Users/ihal/Desktop/dayor/app/models/user.rb:118: синтаксическая ошибка, непредвиденное ключевое слово_self, ожидая ')' def twitter_share (self)

И отправляет это в twitter #

Мой вопрос заключается в том, как правильно настроить передачу 'self', чтобы любой параметр можно было вызывать с помощью twitter.update ()?

Также, как вы выполняете вытягиваниеURL для поста, чтобы вы могли передать URL для публикации в твиттере?

Редактировать:

Попытка Rails.application.routes.url_helpers.post_url (@post,: host =>'myhost.com')

в post.rb

 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

Когда я иду, чтобы удалить сообщение, я получаю сообщение об ошибке:

Started POST "/ posts /32 "для 127.0.0.1 в 2011-04-15 14:57:17 -0700 Обработка PostsController # destroy как HTML Параметры: {" authenticity_token "=>" x8KkqLLCLdTOouUfCMzyWWmwxLIKThnE1n3rQNSkew8 ="," id "=>" 32 "} Пользовательская нагрузка (1,1 мс) ВЫБЕРИТЕ" users ". * FROM" users "WHERE (" users "." id "= 5) LIMIT 1 Завершено за 82 мс

ActionController :: RoutingError (маршрут не соответствует {: action => "destroy",: controller => "posts"}): app / models / post.rb: 37: в <class:Post>' app/models/post.rb:19:in 'app / controllers / posts_controller.rb:36: in authorized_user

1040 * Rendered /Users/ihal/.rvm/gems/ruby-1.9.2-p136@rails3gemset/gems/actionpack-3.0.1/lib/action_dispatch/middleware/templates/rescues/routing_error.erb в пределах rescues / layout (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

Ответы [ 3 ]

2 голосов
/ 16 апреля 2011

Думали ли вы об использовании Observer ?Таким образом, вы можете сохранить материал after_commit, который, по-видимому, не принадлежит модели, на своем месте.Кроме того, это помогает упростить вашу модель, а не загромождать ее.

При синтаксической ошибке self - зарезервированное слово.Переименуйте имя переменной в объявлении метода.Так что попробуйте что-то вроде:

def twitter_share(post)
  # do stuff
end

Чтобы получить доступ к помощникам URL за пределами контроллера, используйте:

Rails.application.routes.url_helpers.post_url(@post, :host => 'myhost.com') 

Не забудьте использовать параметр: host при доступе к помощникам URLвне контроллера, так что у помощника есть контекст.

0 голосов
/ 16 апреля 2011

в коде я вижу, что заголовок и содержимое являются атрибутами Post. поэтому передача их в качестве имени будет преобразована в их значение.

теперь вы передаете себя в twitter_share от post, тогда объект post будет передан этому методу. вам нужно изменить метод twitter_share, как показано ниже, чтобы он работал

def twitter_share(post)
 twitter.update("#{post.title}, #{post.content}")
end
0 голосов
/ 16 апреля 2011
def twitter_share(post) 
  twitter.update("#{post.title}, #{post.content}")
end

Вы передаете сообщение в метод user.twitter_share.

...