2009-05-08 5 views
1

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

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 

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

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

ответ

4

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 

EDIT: Из комментариев, мы также определили, что маршруты были установлены неправильно, и что link_to кода в представлении необходимого для включения @name.id.

+0

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

+0

Да, мне показалось странным, что шоу действие вызывается. Это поможет, если вы также можете показать код в представлении, которое вы используете для создания ссылки. Кроме того, если у вас настроены какие-либо маршруты, это также полезно знать. – Schrockwell

+0

<% @ names.each do | name | %> <% = link_to "UP",: действие =>: upvote%>/<% = link_to "DOWN",: действие =>: downvote%> <% = ч name.candidate_name% > <% end %> –

3

Обычно RESTful URL, который отображает, чтобы показать это:

my_resource/id 

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

candidates/1 

Просто на догадку, я буду держать пари, если вы смотрите в конфигурационном/routes.rb , вы найдете что-то вроде:

map.resources :candidates 

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

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

Если запустить

rake routes | grep candidate 

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

+0

Спасибо за вашу помощь! –