Próbuję utworzyć prosty link, który pozwoli admin zatwierdzić użytkownikowi na mojej stronieSzyny 3 Jak użyć łącza link_to do zmiany wartości boolowskiej w db?
całkiem podobny do tego, co ten facet próbował: In Rails 3 how do I use button_to to change the value of a boolean?
Oto jak to miało działać:
- Admin kliknie link, aby zatwierdzić użytkownikowi
- Link wywołuje funkcję aktywują się UsersController
- aktywna funkcja połączeń, które użytkownicy modelu
- model użytkownik aktualizuje zatwierdzony atrybut na true i zapisuje je
a oto jak miałem zamiar zrobić to
w moich użytkowników widok Wskaźnik
<% @users.each do |user| %>
<%= link_to 'Approve', :action => "index", :method => 'activate', :id => user.id, :class => 'btn btn-mini btn-danger' %>
<% end %>
w moim UserController
def activate
@user = User.find(params[:user])
@user.activate_user
end
w moim modelu użytkownika
def activate_user
self.approved = 'true'
self.save
end
a moje trasy
devise_for :users, :controllers => { :registrations => "registrations" }
resources :users do
member do
get 'activate'
put 'activate'
end
end
match "users/:id/activate" => "users#activate"
Teraz gdy klikam odnośnik (zatwierdzić użytkowników), jestem odsyłany do strony indeksu użytkownika (jak ja mam), ale użytkownik pole "zatwierdzone" nadal jest ustawiona na false: I
URL uzyskać po kliknięciu na link:
http://localhost:3000/users?class=btn+btn-mini+btn-danger&id=2&method=activate
pomysłów?
UPDATE
jak sugeruje IV dodaje adres URL do pomocnika link_to
<% @users.each do |user| %>
<%= link_to "Approve", :controller => "users", :id => user.id, :action => "activate", :method => :put, :approved => true %>
<% end %>
Kiedy klikam odnośnik pomocnika mogę
wrong number of arguments (1 for 2)
w app/controllers/users_controller. rb: 7: w "aktywuj"
def activate
@user = User.find(params[:id])
@user.update_attribute(params[:user])
redirect_to "/users?approved=false"
end
Linia 7 gdzie jest błąd @ user.update_attribute (params [: użytkownika])
Co jeszcze należy umieścić tam?
No i tu jest moja droga do tej metody
match "https://stackoverflow.com/users/:id/activate" => "users#activate"
UPDATE V2 Więc zmieniłem tę linię aktualizacji do:
@user.update_attributes(@user.approved, "true")
i wydaje się zrobić wszystko, co chcę do zrobienia oprócz zmiany wartości na true!
Próbowałem również użyć 1 za prawdziwe (i funkcji update_attribute) i nie-strun .. wyczerpaniu pomysłów tutaj lol
Rozwiązanie
Więc jest to niewygodne, ale tak zdarza się, że w moim modelu użytkownika miałem attr_accessor :approved
, co spowodowało, że model nigdy nie wszedł do bazy danych, aby zaktualizować kolumnę :approved
, ale zamiast tego zaktualizował lokalną zmienną :approved
, więc następnym razem, gdy spojrzałam na kolumnę, oczywiście wartość :approved
niezmienione
tldr? jeśli masz attr_accessor w swoim modelu o tej samej nazwie, co kolumna, którą próbujesz zaktualizować => ją usunąć
Drugim parametrem parametru link_to powinien być adres URL, a następnie opcje. Wypróbuj 'link_to" Zatwierdź ", users_path, # ...' –
Sprawdzanie tras rake'u i sprawdzanie, która trasa faktycznie wskazuje na 'user # activate'. Użyj zmiennej pomocniczej. – nicooga