NoMethodError - undefined method

Witam,

Chcę stworzyć formularz rejestracji/logowania na stronę.
Skorzystałem z tego: http://community.programuj.com/p/comboy/Obsługa+użytkowników+w+Ruby+on+Rails i działa elegancko jak stoi samodzielnie, ale jak chciałem przepisać do mojej aplikacji to się posypało (na razie nad rejestracją się męczę :frowning: )

Dostaję error:

[quote]NoMethodError in IndexController#rejestracja

undefined method `pesel=’ for #User:0x2b5ff963d4c0[/quote]
app/controllers/index_controller.rb

[code=“ruby”]class IndexController < ApplicationController

def rejestracja
if request.post?
@user = User.new params[:user]
if @user.save
flash[:info] = “Zostałeś zarejestrowany”
end
end
end
end[/code]
app/model/user.rb

[code=“ruby”]class User < ActiveRecord::Base

validates_presence_of :pesel
validates_uniqueness_of :pesel

attr_accessor :password_confirmation
attr_reader :password

def password=(pw)
salt = [Array.new(6){rand(256).chr}.join].pack(“m”).chomp
self.password_salt, self.password_hash = salt, Deigest::MD5.hexdigest(pw + salt)
end

def password_is? (pw)
Digest::MD5.hexdigest(pw + password_salt) == password_hash
end

end[/code]
db/migrate/001_create_user.rb

[code=“ruby”]class CreateUsers < ActiveRecord::Migration
def self.up
create_table :users do |t|
t.column :pesel, :string
t.column “password_salt”, :string
t.column “password_hash”, :string
t.column “email”, :string
t.column “created_at”, :datetime
end
end

def self.down
drop_table :users
end
end[/code]
no i sama baza danych:

+------------------+-------------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------------+-------------------+------+-----+-------------------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | PESEL | varchar(11) | NO | | | | | Imie | varchar(100) | NO | | | | | Nazwisko | varchar(100) | NO | | | | | password_salt | varchar(255) | NO | | | | | password_hash | varchar(255) | NO | | | | | ulica | varchar(150) | NO | | | | | mieszkanie | varchar(10) | NO | | | | | kod_pocztowy | varchar(6) | NO | | | | | tele_home | varchar(9) | NO | | | | | tele_mobile | varchar(9) | NO | | | | | email | varchar(100) | NO | | | | | gg | varchar(9) | NO | | | | | skype | varchar(100) | NO | | | | | icq | varchar(9) | NO | | | | | active | enum('0','1','X') | NO | | 0 | | | date_registered | datetime | NO | | | | | date_last_update | timestamp | NO | | CURRENT_TIMESTAMP | | +------------------+-------------------+------+-----+-------------------+----------------+ 18 rows in set (0.00 sec)
Co jest powodem tego errora?

Z tego co widzę kolumna w tabeli nazywa się PESEL a w modelu odwołujesz się do pola pesel. Zmień wielkość liter i zobacz czy pomogło. Ogólnie lepiej podążać za konwencjami Rails, zwłaszcza w dziedzinie nazewnictwa. Dużo łatwiej pracuje się z aplikacją napisaną po angielsku :slight_smile:

ActiveRecord nie widzi kolumny ‘pesel’ byc moze dlatego ze w bazie jest ona z duzych liter ‘PESEL’, ogolnie to ty masz tam niezly burdel, imie, nazwisko, mieszkanie, a potem password_salg, password_has, tele_mobile, aziwsko z duzej litery, w migracji create_table :users niektore kolumny tworzysz uzywajac symbolu, inne uzywaja stringa. Pozatym migracjia zaiwera jak widze tylko 5 kolumn, natomiast w bazie masz ich az 18, pomijam ze migracja autoamtycznie dodaje id wiec masz ich razem 6 ale to nadal 3 razy mniej.

  1. Jesli uzywasz rails powinines sie zdecydowac na uzywania angielskich nazw wszedzie, zamiast nazwisko first_name, zamiast imie last_name, zamiast mieszkanie, address itd. pesel w tym przypadku to skort wiec moze zostac podobnie jak gg
  2. Zdecyduj sie czy uzywasz :symboli czy “stringow” podczas tworzenia tabel w bazie danych poprzez migracje
  3. Jesli uzywasz migracji do tworzenia tabel to uzywaj ich konsekwnetnie, roznica w ilosciach pol migracji i bazy danych wnioskuje ze oprocz migracji uzywasz jeszcze do edycji tabel jakiegos clienta sql a to blad.
  4. staraj sie uzywac malych liter w nazwienictwie kolumn, jesli bedziesz uzywal tylko symboli w migracji to rails zrobi to za ciebie

korzystam z tego samego opisu i dostałem coś takiego, co jest powodem generowania tego typu błędów

undefined local variable or method `request’ for LogowanieController:Class

class LogowanieController < ApplicationController if request.post? @user = User.find_by_username{params[:login]} if @user and @user.password_is? params[:password] session[:uid] = @user.id redirect_to :controller => 'logowanie', :action => 'tajne' else @blad_logowania = 'Niepoprawne nazwa usera lub haslo' end end end

jaka wersje rails masz ?

1.2.3

[quote=white.eyed]korzystam z tego samego opisu i dostałem coś takiego, co jest powodem generowania tego typu błędów

undefined local variable or method `request’ for LogowanieController:Class

class LogowanieController < ApplicationController if request.post? @user = User.find_by_username{params[:login]} if @user and @user.password_is? params[:password] session[:uid] = @user.id redirect_to :controller => 'logowanie', :action => 'tajne' else @blad_logowania = 'Niepoprawne nazwa usera lub haslo' end end end
[/quote]
Nieuważnie skopiowałeś z artykułu :slight_smile: to nie ma być bezpośrednio w klasie, ale wewnątrz metody logowanie. Zerknij do artykułu jeszcze raz tam jest poprawnie.

Sprawdzałem ostatnio cały artykuł przeklikując wszystko dokładnie tak jak pisze, wygląda na to że działa, dodałem też info odnośnie zapamiętywania uzytkowników między sesjami.