Как вы используете метод драгоценных камней Rails 3 для обновления модели базы данных?
Я использую драгоценный камень Thumb_Up для рубина на рельсах. https://github.com/brady8/thumbs_up
Я хочу, чтобы пользователи могли голосовать за сообщения. Однако я не могу понять, как разрешить пользователю нажимать кнопку рядом с каждым сообщением и добавлять голос в базу данных.
Я могу добиться этого в консоли rails, выполнив следующие действия:
u=User.first
m=Micropost.first
u.vote_for(m)
Тем не менее, как я могу добиться этого при нажатии кнопки в поле зрения. Я предполагаю, что мне придется использовать ajax, но откуда мне знать URL-адрес, на который я должен публиковать, чтобы это действие произошло?
Любая помощь будет принята с благодарностью.
Обновить:
Большое спасибо за помощь! У меня все еще есть проблема с кодом ниже.
Вот мои маршруты.рб
resources :microposts do
post :vote, :on => :member
end
Посмотреть:
<%= link_to('vote for this post!', vote_micropost_path(@micropost), :method => :post) %>
контроллер:
def vote
@micropost = Micropost.find(params[:id])
current_user.vote_for @micropost
# This assumes you'll only call it via AJAX.
# If your ajax call doesn't return "ok", then you know something went wrong
render :text => 'ok', :layout => false
end
Тем не менее, я все еще получаю эту ошибку: ни один маршрут не соответствует {:controller=>"microposts",:id=>#,:action=>"voice"}
Кто-нибудь знает, почему маршруты не совпадают правильно?
1 ответ
Я предполагаю, что Rails 3. Маршруты Rails 2 будут выглядеть немного иначе.
Сначала вам нужно будет определить маршрут в вашем файле config / rout.rb. Вы могли бы сделать это многими способами. Если у вас уже есть маршрут для микросообщений, вы можете просто добавить действие "голосовать":
resources :microposts do
post :vote, :on => :member
end
(Для ясности вышеприведенное "сообщение" относится к методу HTTP POST и не имеет ничего общего с вашим классом Micropost.) Если вы используете этот маршрут, вам потребуется создать метод "голосования" в контроллере Microposts, чтобы перехватить его., Что-то вроде
def vote
@post = Micropost.find(params[:id])
current_user.vote_for @post
# This assumes you'll only call it via AJAX.
# If your ajax call doesn't return "ok", then you know something went wrong
render :text => 'ok', :layout => false
end
Затем в вызове AJAX POST вашего взгляда (при условии примера маршрута, который я дал), вы получите URL с:
vote_micropost_path(@micropost)
Это будет выглядеть /microposts/56/ голосования