Question

En ce moment, je construis une application de gestion de projet dans des rails, quelques informations de base ici:

En ce moment j'ai 2 modèles, l'un est l'utilisateur et l'autre est client. Les clients et les utilisateurs ont une relation un-à-un (client -> has_one et utilisateur -> belongs_to ce qui signifie que la clé étrangère est dans la table des utilisateurs)

Alors que je suis en train de le faire est une fois que vous ajoutez un client vous pouvez réellement ajouter des informations d'identification (ajouter un utilisateur) à ce client, afin de le faire tous les clients sont affichés avec un lien à côté du nom de ce client ce qui signifie que vous pouvez réellement créer des informations d'identification pour ce client.

Ainsi, afin de faire que j'utilise une aide le lien aide comme ceci.

<%= link_to "Credentials", 
        {:controller => 'user', :action => 'new', :client_id => client.id} %>

Ce qui signifie qu'il url sera construit comme ceci:

http://localhost:3000/clients/2/user/new

En créant l'utilisateur pour le client qu'il ID de 2.

Et puis capturer les informations dans le contrôleur comme ceci:

@user = User.new(:client_id => params[:client_id])

EDIT: Voici ce que j'ai actuellement à mon avis / contrôleur et Routes

Je continue à obtenir cette erreur: Aucun résultat de route "/ clients // user" avec {: method =>: après}

Routes

ActionController::Routing::Routes.draw do |map|
  map.resources :users
  map.resources :clients, :has_one => :user
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

Contrôleur

class UsersController < ApplicationController
  before_filter :load_client

  def new
    @user = User.new
    @client = Client.new
  end

  def load_client
    @client = Client.find(params[:client_id])
  end

  def create
    @user = User.new(params[:user])
    @user.client_id = @client.id
    if @user.save
      flash[:notice] = "Credentials created"
      render :new
    else
      flash[:error] = "Credentials created failed"
    render :new
   end
  end

Voir

   <% form_for @user, :url => client_user_url(@client)  do |f| %> 
        <p>
            <%= f.label :login, "Username" %>
            <%= f.text_field :login %>
        </p>
        <p>
            <%= f.label :password, "Password" %>
            <%= f.password_field :password %>
        </p>

        <p>
            <%= f.label :password_confirmation, "Password Confirmation" %>
            <%=  f.password_field :password_confirmation %>
        </p>

        <%= f.submit "Create", :disable_with => 'Please Wait...' %>

    <% end %>
Était-ce utile?

La solution 2

Je résolu ce problème en utilisant des attributs imbriqués, en incluant le modèle utilisateur, lors de la création du client. Et cela fonctionne parfaitement.

Dans le cas où l'un des gars dont vous avez besoin de plus d'information sur les deux ici screencasts qui m'a aidé à venir avec comme solution:

http://railscasts.com/episodes/196-nested -modèle-form-partie-1

http://railscasts.com/episodes/196-nested -modèle-form-partie-2

Autres conseils

Votre balise form est mauvaise, vous envoyez des messages /users sans :client_id.

Essayez ceci:

<% form_for @user, :url => {:controller => 'users', :action => 'new', :client_id => @client.id} do |f| >

Vous pouvez utiliser les ressources imbriquées:

config / routes.rb

map.resources :clients do |clients|
  clients.resources :users
end

Contrôleur

class UsersController < ApplicationController
  before_filter :load_client

  def load_client
    @client = Client.find(params[:client_id])
  end

  # Your stuff here
end

Afficher

<% form_for [@client, @user] do |f| %>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top