Прежде всего, я бы создал следующий маршрут в вашем маршруте.rb:
resources :bands do
post :add_code, :on => :member
end
Это создаст дополнительный маршрут, похожий на этот:
add_code_band_path POST /bands/:id/add_code(.:format) {:action=>"add_code", :controller=>"bands"}
Затем из ваших представленийВы можете использовать метод button_to helper для отправки запроса на публикацию следующим образом:
<%= button_to "Add Code", add_code_band_path(@band), :method => :post %>
Когда пользователь нажимает на эту кнопку, вы можете обработать остальное из действия контроллера следующим образом:
class BandsController < ApplicationController
...
def add_code
@band = Band.find(params[:id])
@code = current_user.codes.find_or_create_by_band_id(@band.id)
render :action => :show
end
Наконец, фактический случайный код, который я сгенерировал бы из обратного вызова before_create из самой модели кода, например:
class Code < ActiveRecord::Base
...
before_create :generate_code
private
def generate_code
self.code = SecureRandom.hex(3)
end
end
Тогда, если вы считаете, что это необходимо, вы также можете добавить другие проверки, например, только показкнопка «Добавить код», если код не существует, или, возможно, добавить сообщения об ошибках, если пользователь пытается добавить другой код для того же диапазона, но я оставляю это вам.Помощник button_to также поддерживает Ajax с помощью :remote => true
, так что вы можете развивать его так, как хотите.