11

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ć:

  1. Admin kliknie link, aby zatwierdzić użytkownikowi
  2. Link wywołuje funkcję aktywują się UsersController
  3. aktywna funkcja połączeń, które użytkownicy modelu
  4. 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ąć

+0

Drugim parametrem parametru link_to powinien być adres URL, a następnie opcje. Wypróbuj 'link_to" Zatwierdź ", users_path, # ...' –

+0

Sprawdzanie tras rake'u i sprawdzanie, która trasa faktycznie wskazuje na 'user # activate'. Użyj zmiennej pomocniczej. – nicooga

Odpowiedz

8

Można zaktualizować poniższy kod

przeglądanie

<% @users.each do |user| %> 
<%= link_to 'Approve', active_user_path(user) %> 
<% end %> 

You Controller

def activate 
    @user = User.find(params[:id]) 
    if @user.update_attribute(:approved, true) 
    redirect_to "something" 
    else 
    render "something" 
    end 
end 

Twoje trasy

match "users/:id/activate" => "users#activate", :as => "active_user" 

Nadzieja może ci pomóc.

+0

Wprowadziłem zmiany, które zasugerowałeś, ale wciąż dostaję ten błąd 'zła liczba argumentów (1 na 2)' dla tej linii '@ user.update_attribute (zatwierdzony: true)' – Matti

+0

Okey to jest super dziwne: działa, aby zmienić atrybut ': email', ale nie': approved', czy ma to znaczenie, że im używa sqlite? wydaje się, że woli mieć "t" zamiast prawdziwego (ale wartość nadal nie ulega zmianie w db) – Matti

+0

Wydaje się, że Rails i Sqlite nie komunikują się bardzo dobrze, jeśli chodzi o boolian! Potrzebuję jakiegoś adaptera, ale rozwiązałeś mój stary problem dzięki! :) – Matti

2

Wygląda na to, że nie wywołujesz prawidłowo linku link_to. Zauważ, że masz działanie jako parametr http, a nie część adresu URL.

URL powinien być

http://localhost:3000/users/123/activate

Spójrz na przykłady na tej stronie:

http://apidock.com/rails/ActionView/Helpers/UrlHelper/link_to

Myślę, że trzeba użyć: controller => 'użytkownicy': action => "aktywuj".

Pamiętaj można użyć ciąg tutaj na ścieżce, a także: "https://stackoverflow.com/users/${@user.id}/activate"

+0

Bardzo dziękuję za link! Po przeczytaniu API nie jestem pewien, czy link_to jest odpowiednią metodą, aby to zrobić. Wszystko, co chcę, to przycisk, który wywołuje funkcję "aktywuj" w kontrolerze użytkownika, który sprawia, że ​​zatwierdzony atrybut jest prawdziwy, po prostu wróć do indeksu użytkowników, czy powinienem użyć do tego odnośnika? – Matti

+0

Być może tag przycisku będzie lepszy. Zobacz http://stackoverflow.com/questions/2254720/is-there-a-way-with-rails-form-helper-to-produce-a-button-tag-for-submit – RonanOD

+0

Myślę, że mogę uzyskać link do pracuj, gdzie masz rację co do brakującego adresu URL, ale to doprowadziło mnie do nowego błędu zobacz mój zaktualizowany wpis :) – Matti

0

Metoda attr_accessor utworzy zmienną instancji oraz procedurę pobierającą i ustawiającą dla tej zmiennej.

Podczas próby aktualizacji kolumny bazy danych o tej nazwie, zamiast niej używana jest zmienna instancji. Jest to przydatne, jeśli chcesz mieć "wirtualną kolumnę", która będzie działała jak aktualna kolumna, ale będzie przechowywana w pamięci.

przypadku kolumn bazodanowych masz attr_accessible co pozwala na masową cesji tej kolumny (ten zostanie wycofany w szynach 4), lub można nie stosować metodę definiowania dostępności kolumn i niech ActiveRecord kontrakt z nim.

Powiązane problemy