Pergunta

No momento, estou construindo um aplicativo de gerenciamento de projetos no Rails, aqui estão algumas informações em segundo plano:

No momento, tenho 2 modelos, um é usuário e o outro é cliente. Clientes e usuários têm um relacionamento individual (Cliente -> Has_one e Usuário -> Pertence_to, o que significa que a chave estrangeira está na tabela de usuários)

Então, o que estou tentando fazer é quando você adicionar um cliente, você pode realmente adicionar credenciais (adicione um usuário) a esse cliente, a fim de fazê -lo todos os clientes estão sendo exibidos com um link ao lado do nome desse cliente, o que significa que você pode realmente criar credenciais para esse cliente.

Portanto, para fazer isso, estou usando um ajudante, o link para ajudante assim.

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

O que significa que ele será construído assim:

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

Ao criar o usuário para o cliente com o ID do 2.

E depois capturar as informações no controlador como este:

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

Editar: é isso que eu tenho atualmente em minha opinião/controlador e rotas

Eu continuo recebendo este erro: nenhuma rota corresponde a "/clientes // user" com {: método =>: post}

Rotas

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

Controlador

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

Visão

   <% 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 %>
Foi útil?

Solução 2

Resolvi isso usando atributos aninhados, incluindo o modelo do usuário, ao criar o cliente. E funciona perfeitamente.

Caso qualquer um de vocês precise de mais informações, aqui estão os dois screencasts que me ajudaram a encontrar como solução:

http://railscasts.com/episodes/196-nested-model-form-part-1

http://railscasts.com/episodes/196-nested-model-form-part-2

Outras dicas

Sua tag de formulário está errada, você está postando para /users sem o :client_id.

Experimente isso:

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

Como alternativa, você pode usar recursos aninhados:

config/rotas.rb

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

Controlador

class UsersController < ApplicationController
  before_filter :load_client

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

  # Your stuff here
end

Visão

<% form_for [@client, @user] do |f| %>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top