Formularz z checkboxami. Mała patologia, utknąłem

Cześć,

Mam taki oto formularz.

Z takim oto straszącym kodem:

[code=ruby]

app_menu.html.erb

<%= form_for :subscription do |f| %>


    <% @apps.each do |app| %>

  • <%= check_box_tag app.id, current_user.access?(app) %><%= app.name %>

  • <% end %>

<%= f.submit %>
<% end %>
<% end %>

#kontroler
def app_menu
@apps = App.all
if request.post?
if params[:subscription] and params[:subscription][:app_id]
params[:subscription][:app_id].each do |app_id|
Subscription.create_unique({user_id: current_user.id, app_id: app_id, verified: true, approved:true})
end
redirect_to root_path
end
end
end
@subscriptions = current_user.subscriptions

Relacje

App
has_many :subscriptions
has_many :users, through: :subscriptions
User
belongs_to :app
has_many :subscriptions, :dependent => :destroy
Subscription
belongs_to :user
belongs_to :app[/code]
Problem jest taki: Jak sprawdzić, które pola zostały odznaczone i usunąć dla nich Subskrypcję(app). Muszę wykonać na odznaczonych aplikacjach: Feed.remove_app_items(app)
No i oczywiście być może da się to trochę zrefaktorować.

EDIT:
Narazie, mam coś takiego:

def app_menu @apps = App.all if request.post? if params[:subscription] and params[:subscription][:app_id] params[:subscription][:app_id].each do |app_id| Subscription.create_unique({user_id: current_user.id, app_id: app_id, verified: true, approved:true}) @apps.reject!{|app| app.id == app_id.to_i} end @apps.each do |app| Subscription.where("user_id = #{current_user.id} AND app_id = #{app.id}").delete_all end current_user.reload redirect_to root_path end end @subscriptions = current_user.subscriptions end
Ale w przypadku kiedy odznaczone wszystkie applikacje(App) jak widać nic się nie dzieje.
Jak w takim przypadku to zrefaktorować?

Gdybyś miał tam wygodną relację activerecordową (co polecam patrząc na Twój kod) to mógłbyś się wymigać klasycznym

user.subscripted_app_ids = params[:subscription][:app_id]

EDIT: jak już Twój problem będzie rozwiązany proponuję forumowy minikonkurs na refaktoryzację tego kodu, bo mnie trochę zaczęło wszystko boleć jakoś tak koło piątej linijki :wink:

Kod jest na moje nieszczęście nie mój i ma ze dwa lata :stuck_out_tongue:

Trochę zrefaktorowałem i dodawanie/usuwanie subskrypcji działa jednakże poza trzema rzeczami.

def app_menu @apps = App.all if params[:subscription] and params[:subscription][:app_id] apps = App.find(params[:subscription][:app_id]) current_user.apps = apps current_user.save end end

  1. Nie wiem jak teraz zgrabnie dla każdej subskrypcji zmienić atrubut approved na true
    Poprzednio:
Subscription.create_unique({user_id: current_user.id, app_id: app_id, verified: true, approved:true})
  1. Nadal pozostaje problem, że muszę wyciągnąć które pola zostały odznaczone aby dla tych konkretnych applikacji uruchomić Feed.destroy_app_items(app).
  2. Nie mogę odznaczyć wszystkich 3 aplikacji gdyż wtedy params[:subscription] jest nilem.

Może macie jakieś sugestie. Czy idę w dobrym kierunku?