Как вы используете gem-метод Rails 3 для обновления модели базы данных? - PullRequest
0 голосов
/ 12 апреля 2011

Я использую драгоценный камень Thumb_Up для рубина на рельсах.https://github.com/brady8/thumbs_up

Я хочу, чтобы пользователи могли голосовать за сообщения.Однако я не могу понять, как разрешить пользователю нажимать кнопку рядом с каждым сообщением и добавлять голос в базу данных.

Я могу добиться этого в консоли rails, выполнив следующие действия.:

u=User.first

m=Micropost.first

u.vote_for(m)

Тем не менее, как я могу добиться этого при нажатии кнопки в представлении.Я предполагаю, что мне придется использовать ajax, но откуда мне знать URL-адрес, на который я должен публиковать, чтобы это действие произошло?

Любая помощь будет принята с благодарностью.

Обновление:

Большое спасибо за помощь!У меня все еще есть проблема с кодом ниже.

Вот мой route.rb

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 Ответ

1 голос
/ 12 апреля 2011

Я предполагаю, что 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 / голосования

...