2013-07-24 12 views
7

Moje pytanie jest podobne do Build vs new in Rails 3.Buduj i nowy w Railsach 4

W Railsach 3 mogłem zbudować obiekt w widoku, aby sprawdzić autoryzację za pomocą Cancan.

<% if can? :create, @question.answers.new %> 
    # Code... 
<% end %> 

W szyn 3, różnica między .new i .build, że .build dodano świeżo utworzony przedmiotu do zbierania rodzica, który z kolei spowodowało dodatkową zapisu w widoku, co oczywiście nie zawsze jest pożądany.

W obu Railsach oba dodają obiekt do kolekcji, renderując pusty rekord w widoku.

Czy ktoś ma jakieś porady, jak rozwiązać ten problem? Sprawdzenie, czy rekord jest w widoku .persisted?, byłoby opcją, ale wydaje mi się, że nie powinienem tego robić.

Edit: W celu wyjaśnienia, model CanCan wygląda następująco:

can :manage, Answer do |answer| 
    user.belongables.include?(answer.question.try(:belongable)) 
end 

z tego powodu, że nie można po prostu sprawdzić przez klasę. Właściwa instancja jest rzeczywiście potrzebna do porównania na podstawie relacji.

+1

Co powiesz na "jeśli można? : create, Odpowiedz' jako obiekt do rzucania? (Wygląda na to, że możesz przekazać lekcję tutaj: https://github.com/ryanb/cancan/wiki/Checking-Abilities#checking-with-class) – GSP

Odpowiedz

2

Mogłem rozwiązać problem i odkryłem dwa sposoby.

Po pierwsze, jako https://github.com/rails/rails/issues/9167 zwraca uwagę, używając scoped rozwiązuje to. Dlatego zamiast tego używam @question.answers.scoped.new. Jak wyjaśniłem, prosty Answer.new(question: @question) nie udało się, ponieważ potrzebnych było więcej danych, a przykład został uproszczony.

Po drugie, utrzymanie wzoru MVC. Za przygotowanie danych odpowiedzialny jest kontroler. Tak więc, podczas zapętlania pytań, przygotowujesz dane w kontrolerze, na przykład @answers = @question.answers. Teraz kolekcja @answers nie jest pod wpływem .new lub .build powiązania.

4

Nie jestem w pełni aktualny w CanCan, ale chyba że możliwość tworzenia jest powiązana z konkretną instancją @question w CanCan, wygląda na to, że możesz bezpośrednio sprawdzić uprawnienie do klasy. Żadne wystąpienie nie musi być budowane i nie ma żadnego obcego obiektu w twoim widoku.

<% if can? :create, Answer %> 
    # Code.. 
<% end %> 

https://github.com/ryanb/cancan/wiki/Checking-Abilities#checking-with-class

EDIT:

podstawie edycji, spróbuj budowy autonomicznego odpowiedzi ze Stowarzyszeniem na pytanie, które trzeba.

<% if can? :create, Answer.new(question: @question) %> 
    # Code.. 
<% end %> 

ta nie powinna, przynajmniej, dodać instancję Answer do swojej kolekcji @question.answers.

+0

Problem polega na tym, że ograniczenia mogą dotyczyć podzbioru odpowiedzi związanych do tego konkretnego pytania, które IMHO wymaga od instancji do sprawdzenia. – pduersteler

+0

Może dodanie definicji zdolności CanCan może dać więcej wglądu? – GSP

+0

Zaktualizowane pytanie. – pduersteler

Powiązane problemy