Lista wielokrotnego wyboru oraz logowanie

Cześć,

mam pole Ocena i chciałem zrobić 5 pól z oceną tekstową i kropkami do wyboru danej oceny (coś w rodzaju kropka Bardzo Dobry, kropka Dobry itp). Można wybrać tylko jedną ocenę, ocena jest zapisywana do bazy w stringu.

Druga sprawa, jeśli chodzi o logowanie. Logowanie zrobiłem na podstawie http://railscasts.com/episodes/250-authentication-from-scratch
Jak zabezpieczać podstrony przed dostępem nieautoryzowanym?

Na razie w kontrolerze, i w każdej metodzie wstawiam kod:

if current_user else redirect_to :log_in end
Jest inny sposób ?

W ApplicationController dodaj authenticate_user!

[code=ruby]class ApplicationController < ActionController::Base
before_filter :authenticate_user!

protected
def user_signed_in?
current_user ? true : false
end

def authenticate_user!
redirect_to :log_in unless user_signed_in?
end
end[/code]
Wtedy chronione będą wszystkie kontrolery dziedziczące po ApplicationController. Jeżeli chcesz pominąć autentykacje:

[code=ruby]class ArticlesController < ApplicationController
skip_before_filter authenticate_user!, only: [:index, :show]

end[/code]

Dzięki. Z tym już sobie poradziłem.

Zostaje tylko ten wybór ocen, nie potrzebuję koniecznie takiego rozwiązania. Może być podobne, byleby spełniało swoje rozwiązanie.

Ale czego konkretnie nie wiesz? Jak to rozwiązać w javascipcie czy po stronie serwera? Ciężko pomóc bez konkretnego pytania :wink:

Jeżeli chodzi o js to spróbuj może http://www.wbotelhos.com/raty/

Powiedz co chcesz dokładnie uzyskać, czego nie wiesz, pokaż jakiś kawałek kodu z którym masz problem. Bez tego będzie ciężko :slight_smile:

I przy okazji - jesteś pewien, że zapisywanie w stringu to jest dobre rozwiązanie? Może i to nie jest jakaś duża aplikacja, ale lepiej sobie trzymać oceny jako liczby (1…6), a potem tylko zamienić je na tekst np. za pomocą tablicy:

[code]stopnie = ["", “niedostateczny”, “dopuszczający”, “dostateczny”, “dobry”, “bardzo dobry”, “celujący”]

ocena = 5
stopnie[ocena] # => “bardzo dobry”[/code]
A jeśli chodzi o html, może zamiast radioboxa, wygodniejszy będzie select box (lista rozwijana)? : )

[quote=zlw]Ale czego konkretnie nie wiesz? Jak to rozwiązać w javascipcie czy po stronie serwera? Ciężko pomóc bez konkretnego pytania :wink:

Jeżeli chodzi o js to spróbuj może http://www.wbotelhos.com/raty/

Powiedz co chcesz dokładnie uzyskać, czego nie wiesz, pokaż jakiś kawałek kodu z którym masz problem. Bez tego będzie ciężko :)[/quote]
Nie wiem po prostu jak wyświetlić select albo “kropkoboxa” i zapisać. Wiem jedynie jak to jest z polem tekstowym <%= f.text_field :zmienna %>

O to chodzi?

<%= f.radio_button :ocena, 1 %> <%= f.radio_button :ocena, 2 %> <%= f.radio_button :ocena, 3 %> <%= f.radio_button :ocena, 4 %> <%= f.radio_button :ocena, 5 %>

spróbuj https://github.com/edgarjs/ajaxful-rating. w README masz wszystko mniej więcej opisane. Jakbyś miał jakiś problem, pytaj :slight_smile:
Nie wiem tylko jak to działa z Rails3. Widzę, że jest oddzielny branch rails3. Jakby master nie działał, spróbuj w Gemfile:

gem 'ajaxful_rating', git: 'https://github.com/edgarjs/ajaxful-rating.git', branch: 'rails3'

@nagl to już chyba lepiej napisać

<% 5.times do |n| %> <%= f.radio_button, :ocena, n %> <% end %>
I ewentualnie przenieść do helpera

[quote=zlw]@nagl to już chyba lepiej napisać

<% 5.times do |n| %> <%= f.radio_button, :ocena, n %> <% end %>
I ewentualnie przenieść do helpera[/quote]
Lepiej. :slight_smile:

[quote=swistak35]I przy okazji - jesteś pewien, że zapisywanie w stringu to jest dobre rozwiązanie? Może i to nie jest jakaś duża aplikacja, ale lepiej sobie trzymać oceny jako liczby (1…6), a potem tylko zamienić je na tekst np. za pomocą tablicy:

[code]stopnie = ["", “niedostateczny”, “dopuszczający”, “dostateczny”, “dobry”, “bardzo dobry”, “celujący”]

ocena = 5
stopnie[ocena] # => “bardzo dobry”[/code]
[/quote]
Chciałem wykorzystać to w widoku, wrzuciłem tą tablice w model, w widoku wyświetlam w pętli, ale dostaję bład niezdefiniowana zmienna stopnie.

zrob sobie jakis helper

[code=ruby]def stopnie
stopnie = [“niedostateczny”, “dopuszczający”, “dostateczny”, “dobry”, “bardzo dobry”, “celujący”]
return stopnie
end

stopnie.each {|x| p x}[/code]
wypisze ci wszystkie stopnie

cos na konkretna ocene

def stopien(ocena) s = stopnie return s[ocena.to_i-1) end
Bardzo prosty i az przesadny przyklad ale chyba wiesz o co chodzi?

@gotar z jakiegoś konkretnego powodu te tymczasowe zmienne i returny? nie lepiej

[code=ruby]# encoding: UTF-8

def stopnie
[“niedostateczny”, “dopuszczający”, “dostateczny”, “dobry”, “bardzo dobry”, “celujący”]
end

def stopien(ocena)
stopnie[ocena.to_i-1]
end[/code]
@chinchin lepiej ocen (“dopuszczający”, “dobry”) nie definiować w helpere, ale jeśli już to pamiętaj o pierwszej linijce ("#encoding: UTF-8"), bez tego będzie wyrzucało błąd. Najlepiej jednak użyć i18n

Edit:
Po co funkcje :wink: Jeszcze krócej! :smiley:

[code=ruby]stopnie = [“niedostateczny”, “dopuszczający”, “dostateczny”, “dobry”, “bardzo dobry”, “celujący”]
stopien = -> ocena { stopnie[ocena.to_i-1] }

stopien[1] #=> “niedostateczny”
stopien.(3) #=> “dopuszczający”[/code]

Jeśli coś piszę dla kogoś kto mało jeszcze wie to rozpisuję jak się da by widać było skąd i czemu, ale oczywiście można to skracać i przerabiać wiele razy. Jak napisałem

[cite]
Bardzo prosty i az przesadny przyklad
[/cite]

No okej, może drugi mój przykład już trochę przekombinowany (więcej pisania a interfejs taki sam jak w przypadku zwykłej tablicy i pierwszego pustego elementu - rozwiązanie świstaka35 :D), ale pierwszy imho nie jest bardziej skomplikowany, a za to bardziej ruby way (czyli tak, jak początkujący powinni od początku się uczyć) :wink:

Dałem ten pusty element żeby było jakoś tak prościej dla początkującego, chociaż jak to się drugi raz przeczyta to to trochę głupie, ale “intuicyjniej” wywoływać : )

A to co wkleiłeś… Jak to działa? Pierwszy raz widzę takie cuda “->” w rubim… Jak to się nazywa i gdzie to opisane? : >

Od 1.9 mozna tak lambdy zapisywac :slight_smile:

Trik poznany z definicji miesięcy dla i18n (ten z nilem na początku). Reszto to takie moje dodakti:

[code]STOPNIE = [nil, “niedostateczny”, “dopuszczający”, “dostateczny”, “dobry”, “bardzo dobry”, “celujący”].map(&:freeze).freeze # albo jeszcze lepiej użyć konstrukcji %w()
def stopnie
STOPNIE
end

def stopien(ocena)
stopnie[ocena]
end[/code]

Nowości i zmiany w Ruby 1.9 #5 - bloki, domknięcia, nowa lambda” na blogu Radarka

Cześć,
stworzyłem metode w ApplicationController w sekcji protected sprawdzajaca jaki jest to typ użytkownika zwraca ona wartość true lub false.

Jeśli w kontrolerze użyję before_filter :metoda i potem w plikach tej samej klasy w views użyję <% if @metoda %> to kod dziala dobrze, natomiast jesli użyję <% if @metoda %> w views innej klasie (tez dziedziczacej z ApplicationController) bez uzycia befor_filter to niestety kod nie działa dobrze, jest jakby ciągle false.

jak zrobić, zeby korzystać z tych metod w dowolnym miejscu ? Umieściłem je w sekcji public ale bez zmian

musisz z niej zrobić helpera jak już chcesz jej tak używać.

W kontrolerze dajsze wpis, coś jak:

helper_method :nazwa_metody1, :nazwa_metody2

itd