Rails 3 has_many, как создать объект и его отношения из действия индекса - PullRequest
0 голосов
/ 13 ноября 2011

У меня есть группы, коды и пользователи.

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

так:

Код множится__: полоса, принадлежат_в:Пользователь Band has_many: коды Пользователь has_many: коды

Так что теперь мне нужно использовать form_for (я думаю), чтобы создать кнопку, которая при нажатии делает следующее:

проверить, есть ли у пользователякод с этой полосой (у пользователя может быть один код на полосу)

Если нет:

  • Создает 6-значный буквенно-цифровой ключ / код (я знаю, что ActiveSupport может это сделать: <% =SecureRandom.hex (3)%> но это должно быть в модели или контроллере)
  • Установите правильные ассоциации, этот код работает для этого пользователя и этого диапазона.Я использую Devise, поэтому у меня есть доступ к методу current_user
  • и возвращаю пользователя в действие Band # show

Если у пользователя уже есть код для этого диапазона, то онвыдается ошибка «У вас уже есть код»

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

Ответы [ 2 ]

0 голосов
/ 13 ноября 2011

Прежде всего, я бы создал следующий маршрут в вашем маршруте.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, так что вы можете развивать его так, как хотите.

0 голосов
/ 13 ноября 2011

Попробуйте в вашей группе / кодах пользователя has_many: через

Вам нужно будет создать таблицу соединений и модель соединения, но я думаю, что это то, что вы ищете.

...