Rails: Como tratar alguns campos das informações do modelo de forma independente? Por exemplo. Informações da conta vs. perfil

StackOverflow https://stackoverflow.com/questions/2322032

Pergunta

Eu tenho um modelo de usuário com as informações usuais (login, email, nome, localização etc.). No entanto, quando os usuários decidem editar suas informações, gostaria de separar os campos a serem editados de acordo com as preocupações apropriadas.

Por exemplo, eu gostaria de ter Name, Bio e Location para ser editado em um Profile página ou guia, e login, email e password para ser editado em um Account página ou guia.

Quais são as melhores práticas e a maneira mais segura para conseguir isso? Devo ter dois modelos/recursos separados: Usuário e Usuário PROFILE? Ou posso apenas criar algo como um profile Método no UserController, com um formulário personalizado apenas com os campos de perfil específicos e link para ele na página do usuário? Estou realmente confuso sobre como fazer isso.

Agradecemos antecipadamente por quaisquer idéias que você possa ter.

Foi útil?

Solução

Eu acho que depende do restante do seu aplicativo. Parece que, no seu caso, é bom ser modular. Se você deseja que os usuários possam ver o perfil de outros usuários, é uma vantagem ter um modelo separado para o perfil e gostar com um relacionamento Has_One. Eu apenas chamaria a aula Profile Portanto, pode ser acessado através user.profile em seus controladores e visualizações.

Modelos:

class User < ActiveRecord::Base
  has_one :profile, :dependent => :destroy
end

class Profile < ActiveRecord::Base
  belongs_to :user
end

Outras dicas

Se todos os seus usuários tiverem campos de perfil e conta, eu não o colocaria em modelos separados. Ele adicionará apenas a complexiedade desnecessária aos seus formulários e adicionará algumas consultas SQL.

Não vejo aqui nenhum problema de segurança. No caso de edição, ambas as ações (conta e perfil de edição) devem ser protegidas da mesma maneira - portanto, apenas o usuário do proprietário deve ser capaz de editar os dois. Se ele quiser "invadir" e editar também seu login quando ele edita seu primeiro nome, então é o problema dele. Não causará nenhum problema, pois ele pode editar os dois campos.

De acordo com visualizações visíveis para outras pessoas: apenas não exiba nenhum campo que pertence à parte da conta.

Como separá -lo? Para mim, a maneira mais limpa é adicionar esse tipo de rotas:

map.resources :accounts
map.resources :profiles

E usar caminhos como /accounts/34/edit Para editar a parte da conta e /profiles/34/edit Para editar a parte do perfil.

Nesse caso, você precisará de um controlador separado para ambas as rotas: accounts_controller.rb e profiles_controller.rb. Se eles compartilharem muitos métodos e comportamentos semelhantes, você pode adicioná -lo users_controller.rb e em perfis e controladores de contas herdam dele.

Você também pode fazer isso com um controlador:

map.resources :accounts, :controller => 'users'
map.resources :profiles, :controller => 'users'

Mas não sei como passar algum valor adicional com rotas criadas com resources. Quando você usa connect você pode passar com isso :defaults => {:foo => 'bar'} e então estará disponível no controlador como params[:foo] Mas não parece funcionar com resources. Então, como você pode distinguir entre contas e perfis? Você pode lê -lo a partir do URL atual (Aqui está o exemplo). E então, no controlador, você pode renderizar visões diferentes de acordo com o recurso solicitado.

Eu estaria inclinado a cortar o grão aqui. Vai ser mais fácil mapear um modelo para um formulário. Portanto, se você tiver informações acessadas em diferentes formas na sua interface do usuário, eu criaria um modelo para cada um.

Dito isto, em um determinado momento dos meus sistemas, tendem a retirar as informações do perfil da classe de usuário base, para que o usuário se torne apenas para autenticação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top