2015-09-24 2 views
1

В моем приложении пользователи имеют много компаний, и у компаний есть много пользователей, у компаний есть много подразделений, и у пользователей есть разное подразделение в разных компаниях, например, пользователь с идентификатором 1 принадлежит Компании 1 и 2 и 2 Компании 3 . Р.Б.Как передать параметр для обновления действия?

class User < ActiveRecord::Base 
    has_many :companies, through: :users_companies 
    has_many :users_companies 
    has_many :divisions, through: :users_divisions 
    has_many :users_divisions 
    has_many :users_roles, dependent: :destroy 
    has_many :roles, through: :users_roles 
end 

Company.rb

class Company < ActiveRecord::Base 

    #before_create :create_division 

    has_many :users_companies 
    has_many :users, through: :users_companies 
    has_many :divisions, dependent: :destroy 
    has_many :positions 
end 

Division.rb

class Division < ActiveRecord::Base 
    has_ancestry 
    belongs_to :company 
    has_many :users, through: :users_divisions 
    has_many :users_divisions 
end 

UsersCompany.rb

class UsersCompany < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :company 
end 

UsersDivision.rb

class UsersDivision < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :division 
    belongs_to :company 
end 

UsersDivision таблицы имеют структуру идентификатор | user_id | division_id | company_id

при создании все хорошо

UsersDivision.create!(user: @user, division_id: params[:user][:division_ids], company_id: @company.id) 

но когда я пытаюсь обновить @user в столбце UsersDivision таблицы company_id будет нил.

def update 
    @company = Company.find(params[:company_id]) 
    @user = User.find(params[:id]) 

    if @user.update(user_params) 
     redirect_to :back 
    end 
    end 

Как передать параметры: company_id, чтобы обновить действие?

<div class="edit-registration-container"> 
<%= @user.full_name %> 
<%= form_for([@company, @user]) do |f| %> 
<%= f.label :last_name, "Фамилия" %><br /> 
    <%= f.text_field :last_name, type: "text" %> 

    <%= f.label :first_name, "Имя" %><br /> 
    <%= f.text_field :first_name, type: "text" %> 

    <%= f.label :middle_name, "Отчество" %><br /> 
    <%= f.text_field :middle_name, type: "text" %> 
    <%= f.label :division_ids, "Подразделение" %><br /> 
    <%= f.select :division_ids, @divisions_select %><br /> 
    <%= f.hidden_field :company_id, value: @company.id %> 
    <%= f.fields_for :positions, @position do |ff| %> 
    <%= ff.label :name, "Должность" %> 
    <%= ff.text_field :name, type: "text" %> 
    <%= ff.hidden_field :company_id, value: @company.id %> 
    <% end %> 
    <%= hidden_field_tag "user[role_ids][]", nil %> 
    <% Role.all.each do |role| %> 
     <%= check_box_tag "user[role_ids][]", role.id, @user.role_ids.include?(role.id), id: dom_id(role) %> 
     <%= label_tag dom_id(role), role.name %><br> 
     <% end %> 
    <%= f.submit "Сохранить", class: "login loginmodal-submit", type: "submit" %> 
<% end %> 
</div> 
+0

Можете ли вы разместить свой код просмотра, пожалуйста. –

+0

Да, конечно, уже добавлено – adyl

+0

'form_for ([@ company, @user])' должен передать идентификатор компании. Вы устанавливаете '@ company' в действии редактирования? –

ответ

1
  1. Вам необходимо разрешить этот параметр, чтобы быть доступным, поэтому добавьте его в пользователя разрешения на контроллер Params:

    params.require(:user).permit(YOUR PARAMETERS, {:company_id => []})

  2. Тогда вы можете назвать его с помощью:

    params["user"]["company_id"]

  3. Я думаю, вы можете просто сделать это внутри ваше действие обновления:

    @company = Company.find(params["user"]["company_id"])

Вот моя рабочий примером форма:

<%= form_for :user, :url => custom_users_path do |f| %> 
    <%= f.text_field :name %> 
    <%= f.hidden_field :company_id, :value => Company.find(1).id %> #4 
<%= f.submit "Submit" %> 

, после передачи, в моем custom action моих params["user"]["company_id"] будет иметь следующее значение: 4

Смежные вопросы