Duvida sobre os models no Rails

Olá programo em java há 2 anos, e há duas semanas atrás comecei a programar em Ruby, comprei um livro de Ruby e um de Ruby on Rails e comecei a estudar, estou ajudando bem produtivo tanto o framework quanto a linguagem, mas estou com uma dúvida e nao sei como resolver é a seguinte:

Tenho o model User gerado pelo scaffold do rails ele herda de ActiveRecord::Base definida desta maneira

class User < ActiveRecord::Base

E a migration esta assim

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :login
      t.string :password
      t.boolean :ativo

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

E o metodo create do controller esta assim

def create
    @user = User.new(params[:user])
    respond_to do |format|
      if @user.save
        flash[:notice] = 'User was successfully created.'
        format.html { redirect_to(@user) }
        format.xml  { render :xml => @user, :status => :created, :location => @user }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

O que eu não consigo entender e porque que diferente do java os atributos do Objeto User nao esta no User.rb e somente no Migration, ou seja como o rails consegue injetar os dados que estão vindo da view no @user, sendo que ele nao tem estar propriedades.
E neste caso por exemplo tenho o cadastro de Usuario com
login
senha
ativo
O ativo e apenas um flag para saber se o usuario pode entrar no sistema, queria que sempre fosse criado como true , como forçar o rails a fazer isso tentei assim no controller mas nao deu certo:

def create
    @user = User.new(params[:login],params[:password],true)
    respond_to do |format|
      if @user.save
        flash[:notice] = 'User was successfully created.'
        format.html { redirect_to(@user) }
        format.xml  { render :xml => @user, :status => :created, :location => @user }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

Ele me lançou um erro Wrong arguments 3 to 1, dizendo que so tem um argumento e estou passando três.

Como resolver este problema?

Orbigado

Você precisa passar como parâmetro um hash com pares :atributo => valor.
Consulte a documentação de ActiveRecord::Base: http://api.rubyonrails.org/

Mas como recuperar os parametros que o usario digitou individualmente ?

Desse jeito:

params[:user] ele vem todos os campos eu quero por exemplo so o login como faço?

Já tentou usar params[:campo]?

Já ele vem vazio!

tente utilizar param[:user][:nomecampo].

é para funcionar

invez de tentar forçar, por que você não coloca como um valor default no banco de dados?

deixa eu completar meu post anterior
o param[:user][:nomedocampo] vai consegui pegar o valor no controlador, mas ele não vai conseguir inserir por causa do

“Wrong arguments 3 to 1” que na verdade quer dizer, 3 parametros para 1
entende? tem mais parametros do que ele espera

o que você pode fazer, usar o default como eu disse no outro post, ou criar um novo método de inserção dentro do modelo
é isso ai

abraços

[quote=flavi0]deixa eu completar meu post anterior
o param[:user][:nomedocampo] vai consegui pegar o valor no controlador, mas ele não vai conseguir inserir por causa do

“Wrong arguments 3 to 1” que na verdade quer dizer, 3 parametros para 1
entende? tem mais parametros do que ele espera

o que você pode fazer, usar o default como eu disse no outro post, ou criar um novo método de inserção dentro do modelo
é isso ai

abraços[/quote]
Conforme falei em meu primeiro post nesse tópico, o método new recebe apenas um parâmetro, que é um hash com pares :atributo => valor.
Novamente, ver a documentação. O link está logo acima.

[quote=flavi0]deixa eu completar meu post anterior
o param[:user][:nomedocampo] vai consegui pegar o valor no controlador, mas ele não vai conseguir inserir por causa do

“Wrong arguments 3 to 1” que na verdade quer dizer, 3 parametros para 1
entende? tem mais parametros do que ele espera

o que você pode fazer, usar o default como eu disse no outro post, ou criar um novo método de inserção dentro do modelo
é isso ai

abraços[/quote]

Valeu flavio pelo resposta, resolvi colocando o default no banco. Mas o [:user][:nomedocampo] funciona sim. Agora uma coisa que acho muito estranho no rails é isso kra dos atributos do usuario nao pertencer a usuario que herda de ActiveRecord::Base e sim estar apenas nas migrations.
É desse jeito mesmo que o pessoal programa ou se faz de outra maneira?

Abraço

Olá.

Os atributos da classe realmente pertence a classe Usuário e não as Migrations. As migrations são artifícios utilizados pelo rails para manutenção da sua base de dados.
Bem, uma vez que eu defini que minha tabela Users vai ter as colunas login,password, o ActiveRecord consegue modificar a classe User em tempo de execução adicionando nesta classe estes atributos.
Repare que existe um conceito fundamental do Rails por trás desta explicação. É Convention over Configuration. Vc tem uma tabela Users, por convenção a classe User vai ser persistida nesta tabela.
Devido a estas convenções o framework ActiveRecord pode adicionar vários comportamentos a classe em tempo de execução. Exemplo:

  • os métodos find_by_<>
  • os métodos de save, update , remove.

Dentre outros.
Isto só é possível porque Ruby é uma linguagem dinâmica. Nestes casos o uso do Padrão ActiveRecord é uma opção bem interessante.

Valeu

o que esta te confundindo é que os atributos do usuário são criados automaticamente,
se a classe tem nome “User”, o rails vai inferir o nome da tabela, que neste caso vai ser "users"
vai listar todos os campos e definir os atributos correspondentes na classe “User”, mas se você quiser, você pode definir mais atributos na classe User (tem exemplos disto no meu blog e no meu livro também :smiley: )

Quanto ao create do usuário, você pode fazer:
params[:user][:active] = true
@user = User.new(params[:user])

Ou então dentro do Model (que seria o local correto), poderia utilizar um “before_create” para fazer esta e outras alterações …

Muuuuuuuuuuito tempo depois…

Existe algum comando pra executar no ./script/console que me liste todos os atributos de um model?
Porque, depois de um tempo, é simplesmente impossível ficar olhando as migrations pra isso. E eu acho que ter que olhar no banco de dados pra saber os atributos é algo totalmente fora dos padrões Rails.

Postei antes de pesquisar… cometi um pecado capital… espero ainda ter salvação…
No ./script/console basta digitar o nome do model e dar um enter.