Метод Rails `link_to` публикуется несколько раз - PullRequest
1 голос
/ 25 августа 2009

[подробности см. В последующем ответе]

Я думаю, что это простой вопрос о рельсах, и в основном о том, как я назвал свои модели и ссылаюсь на них в своем представлении. Итак, немного предыстории, я использую плагин vote_fu, который я считаю великолепным, однако мне трудно заставить голосование работать по следующей ссылке:

<%= link_to "vote for", current_user.vote_for(answer) %>

Если current_user является помощником и возвращает текущего пользователя, который вошел в систему при выполнении этого запроса, проблема, вероятно, заключается в том, как я заявляю answer, который принадлежит моей модели question, любая помощь действительно ценится , даже если вы просто помогаете мне идти по правильному пути!

ой! также это работает в консоли ... так что если я делаю:

user = User.find(1)
user.vote_for(Question.last)

Работает как положено.

Ответы [ 4 ]

1 голос
/ 10 сентября 2009

current_user.vote_for(answer) вызовет этот метод сразу. То, что он указан в url, не означает, что к нему обращаются особенным образом. Он будет выполнен так же, как и любой другой метод ruby.

Вы, вероятно, хотите сделать что-то подобное.

// view
<%= link_to "Vote up", :url => vote_up_answer_path(answer), :method => "post" %>

// controller
class AnswersController < ApplicationController
  def vote_up
    answer = Answer.find(params[:id])
    current_user.vote_up(answer)
    redirect_to :back
  end
end

// routes
map.resources :answers, :member => {:vote_up => :post, :vote_down => :post}
1 голос
/ 04 сентября 2009

Пример, который довольно старый, имеет это в представлении:

<%= link_to "Vote Up", :url => current_user.vote_for(answer), :method => :post %>

Но это заставляет URL-адрес иметь метод голосования в строке запроса ... он использует rjs, и я предпочел бы использовать jquery, не уверенный, как сделать следующий шаг, чтобы заставить это работать, а не голосовать для всех ответов на странице?

1 голос
/ 09 сентября 2009

Разъяснение «vote_for принадлежит вашему контроллеру»:

У вас есть:

<%= link_to "Vote Up", current_user.vote_for(answer) %>

То, что вы действительно хотите, это:

<%= link_to "Vote Up", :controller => 'my_controller', :action => 'vote', :id => answer %>

Метод current_user.vote_for - это метод на сервере. Если вы вызовете этот метод в своем представлении (файл .rhtml), голосование будет происходить, когда страница отображается, а не когда пользователь щелкает ссылку. Вместо этого создайте метод голосования на соответствующем контроллере (здесь я назвал его my_controller, сделайте так, как хотите). Затем метод vote выглядит как пример voice_fu. Link_to создает гиперссылку на действие голосования.

Если вы пытаетесь сделать это через ajax, замените link_to на link_to_remote.

<%= link_to_remote "Vote Up", :url => { :controller => 'my_controller', :action => 'vote', :id => answer } %>

Если файл шаблона views / my_controller / голосования имеет значение «.rjs», JavaScript-файл в этом файле будет выполнен, когда результат метода вернется на страницу. Если это «.rhtml», вы должны посмотреть на помощники для link_to_remote, чтобы легко обновить div на странице с содержанием результата метода (http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html#M001645 - вам нужна опция :update )

0 голосов
/ 25 августа 2009

Мля! Я решил первую часть своего вопроса ... ну ... может быть, кажется, что мое решение не очень успокоительно, вот что я сделал:

<%= link_to "Vote Up", :url => current_user.vote_for(answer), :method => :post %>

Так что странная вещь здесь в том, что это работает, но каждый раз, когда я перезагружаю страницу, она добавляет голосование всем пользователям с ответом (или комментариями, как было бы обеспокоено большинство блогов), это также делает URL * 1004. * Я не уверен, каков мой следующий план действий здесь.


После небольшого дополнительного изучения, пример приложения в качестве примера voice_fu содержит это в действии контроллера, но у меня даже нет контроллера для моей модели голосования, и голоса все еще сделаны, любая идея?

def create
@quote = Quote.find(params[:quote_id])

respond_to do |format|
  if current_user.vote(@quote, params[:vote])
    format.rjs  { render :action => "create", :vote => @vote }
    format.html { redirect_to([@quote.user, @quote]) }
    format.xml  { render :xml => @quote, :status => :created, :location => @quote }
  else
    format.rjs  { render :action => "error" }
    format.html { render :action => "new" }
    format.xml  { render :xml => @vote.errors, :status => :unprocessable_entity }
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...