2011-06-24 3 views
0

Я пытаюсь использовать команду update_attribute, но изо всех сил пытаюсь заставить ее работать (на всех) и надеялся, что кто-то может указать мне в правильном направлении?Начинающий борется с командой update_attribute

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

У меня есть база данных элементов (элементов), которая среди прочего содержит ': item_name', ': click_count' и ': external_url'.

В настоящее время у меня есть представление (Showselecteditems), в котором есть список всех элементов, когда пользователь нажимает на имя элемента, они направляются на соответствующий внешний url. Это работает, используя код:

<%= link_to selecteditem.item_name.to_s, selecteditem.external_url %> 

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

Чтение вокруг, я считаю, что мне нужно изменить код, чтобы что-то вида:

<%= link_to selecteditem.item_name.to_s, selecteditem.external_url, {:controller => params[:controller], :action => clickcountplusone, :identifier => selecteditem.item_name} %> 

И нужно определить эту функцию где-то - кажется, можно найти только если они находятся в «application_helper»?

def clickcountplusone 
    clickeditem = Items.find(params[:identifier]) 
    clickeditem.update_attribute(:click_count, clickeditem.click_count + 1) 
    rescue ActiveRecord::RecordNotFound # to avoid error if no identifier value 
end 

Излишне говорить, что я не могу получить эту работу ... Мой вопрос, поэтому, как я могу настроить все правильно, так что при нажатии на ссылку на счет увеличивается? Другая общая проблема, о которой люди, похоже, сообщают, заключается в том, что число будет увеличиваться каждый раз, когда страница обновляется, и я бы хотел, если бы это было возможно.

Раньше люди предлагали добавить в раздел «показ» контроллера «Items», однако я не знаю, как это будет работать, поскольку ссылки нажимаются на странице просмотра Showselecteditems, а не на самой базе данных, где вы получаете команды show, edit, destroy. Любые советы очень оценили.

ответ

0

Это

<%= link_to selecteditem.item_name.to_s, selecteditem.external_url, {:controller => params[:controller], :action => clickcountplusone, :identifier => selecteditem.item_name} %> 

не будет указывать пользователю на some_controller # clickcountplusone, потому что вы уже указали внешнюю ссылку.

Самый простой способ сделать эту работу, чтобы изменить ваш link_to как:

<%= link_to selecteditem.item_name.to_s, {:controller => params[:controller], :action => clickcountplusone, :identifier => selecteditem.item_name} %> 

А затем изменить ваши действия источника:

def clickcountplusone 
    clickeditem = Items.find(params[:identifier]) 
    redirect_to clickeditem.external_url if clickeditem.update_attribute(:click_count, clickeditem.click_count + 1) 
    rescue ActiveRecord::RecordNotFound # to avoid error if no identifier value 
end 
+0

Спасибо за это - ваша логика кажется гораздо более перспективным чем у меня ... Я внес свои изменения, но я все еще получаю сообщение об ошибке (это моя ошибка, а не твоя ...), которую я также пытался решить. Я получаю следующее сообщение: 'undefined local variable or method 'clickcountplusone' для # <# <Класс: 0x277de50>: 0x27037e0>'. Это проблема с route.rb? В настоящее время 'resources: uniquewetsuits do, get: clickcountplusone, end', clickcountplusone появляется, когда я печатаю' rake routes'. Еще раз спасибо – Texas

+0

Также используется 'get' проблема, так как некоторые вещи, которые я прочитал, предлагают использовать' post', но я не могу понять, возможно ли это с помощью 'link_to'? – Texas

+0

Если вы уже указали маршруты для своих ресурсов, вы можете использовать хелперы маршрутов в link_to: '<% = link_to selecteditem.item_name.to_s, send (" clickcountplusone _ # {params [: controller]} _ path ", selecteditem.item_name)% > '. Но ваши параметры [: controller] должны быть равны именам маршрутов для этого ресурса в 'rake routes' – Hck

Смежные вопросы