Ruby on Rails: ссылка обновляет БД - PullRequest
1 голос
/ 08 мая 2009

Простой вопрос RoR ... Я изучаю ROR и создаю простое приложение для голосования. Кандидаты перечислены в таблице, и рядом с их именем есть ссылки на голосование против. Я пытаюсь сделать так, чтобы все, что пользователь делает, это нажимает на ссылку, счетчик голосов обновляется, и они перенаправляются на начальную страницу. Я не использую строительные леса. По какой-то причине это действие не делает ничего похожего на то, что я хочу:

def upvote
  @name = Name.find(params[:id])
  @name[:votes] += 1
  respond_to do |format|
    if @name.update_attributes(params[:name])
      flash[:notice] = 'Candidate was upvoted'
      format.html = { redirect_to :action => "index" }
      format.xml = { head :ok }
    else
      format.html = { render :action => "index" }
      format.xml = { render :xml => @name.errors, :status => :unprocessable_entity }
    end
  end
end

У меня есть ссылка в представлении, вызывающая правильное действие, она пытается вызвать: show, хотя.

пожалуйста, не судите меня слишком резко, лол ...

Ответы [ 2 ]

4 голосов
/ 08 мая 2009

Метод update_attributes обычно используется для установки полей объекта ActiveRecord из формы POST. Поля были бы найдены как хэш params[:name], например params[:name][:votes].

Если вы нажимаете на ссылку для вызова метода upvote, то вы просто делаете запрос GET. Все, что вам нужно сделать, это позвонить @name.save, чтобы сохранить запись.

def upvote
  @name = Name.find(params[:id])
  @name[:votes] += 1
  respond_to do |format|
    if @name.save
      flash[:notice] = 'Candidate was upvoted'
      format.html = { redirect_to :action => "index" }
      format.xml = { head :ok }
    else
      format.html = { render :action => "index" }
      format.xml = { render :xml => @name.errors, :status => :unprocessable_entity }
    end
  end
end

РЕДАКТИРОВАТЬ: Из комментариев мы также определили, что маршруты были установлены неправильно и что код link_to в представлении необходимо включить @name.id.

3 голосов
/ 08 мая 2009

Обычно RESTful URL, который отображается для отображения:

my_resource/id

Так, например,

candidates/1

Просто догадываюсь, поспорим, если вы посмотрите в config / rout.rb, вы найдете что-то вроде:

map.resources :candidates

Где my_resource - имя вашего контроллера. Если вы собираетесь использовать этот вид маршрутизации, то как ресурс обеспечивает голосование? Пользовательский метод в этом случае кажется мудрым, поэтому:

map.resources :candidates, :collection => { :upvote => :post }

Если вы запустите

rake routes | grep candidate

до и после, вы можете видеть, что было добавлено. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...