3

у меня есть 2 модели с многим ко многим ассоциации следующим образом:рельсы 4 has_many: через не экономить ассоциации

class User < ActiveRecord::Base 
    has_many :remark_users, :dependent => :destroy 
    has_many :designated_remarks, :through => :remark_users, :source => :remark 
end 

class Remark < ActiveRecord::Base 
    has_many :remark_users, :dependent => :destroy 
    has_many :users, :through => :remark_users 

    accepts_nested_attributes_for :users 
end 

и отношения:

class RemarkUser < ActiveRecord::Base 
    belongs_to :remark 
    belongs_to :user 
end 

Действие remarks_controller, что необходимо сделать сохранить:

# PATCH Save users 
def save_users 
    @remark = Remark.find(params[:id]) 
    @remark.users.build(params[:remark_user_ids]) 
    @remark.save 
end 

И форма:

<%= form_for @remark, :url => salveaza_responsabili_remark_path(@remark) do |f| %> 
    <% @users.each do |user| %> 
     <%= check_box_tag 'remark[remark_user_ids][]', user.id, @remark.users.include?(user) %> 
     <%= user.name %> 
    <% end %> 
    <%= hidden_field_tag 'remark[remark_user_ids][]', '' %> 
<% end %> 

Te remarks_controller:

params.require(:remark).permit(:description, :suggestion, :origin_details, process_type_id, :origin_id, :remark_user_ids) 

Оба пользователя и замечание уже существует, мне нужна форма только для создания ассоциаций, предпочтительно с помощью флажков.

В консоли консоль сохраняется. Но я трачу последний день, пытаясь заставить его работать в браузере. Я прочитал все, что мог найти по этому вопросу, и сейчас я очень смущен.

Может кто-нибудь указать мне на то, как должна выглядеть фактическая форма, и если в контроллере нужно добавить что-нибудь еще?

+0

Вы получаете '@remark .users # => [] '? –

+0

Я не уверен, что вы имеете в виду. Не могли бы вы немного объяснить? Я новичок в рельсах. Спасибо! –

ответ

2

Там нет ничего плохого в вашей форме, но она может быть упрощена до следующего

<%= form_for @remark, :url => salveaza_responsabili_remark_path(@remark) do |f| %> 
    <% @users.each do |user| %> 
    <%= check_box_tag 'user_ids[]', user.id, @remark.users.include?(user) %> 
    <%= user.name %> 
    <% end %> 
<% end %> 

Тогда в контроллере, вы можете ожидать, массив из params[:user_ids]

def save_users 
    @remark = Remark.find(params[:id]) 

    # This is where you need to think about things. If the checkbox in the form 
    # contains all the users for a remark, the following code should work. 
    # 
    # @remark.user_ids = params[:user_ids] 
    # @remark.save 
    # 
    # otherwise, you have to loop through each user_id 
    params[:user_ids].each do |user_id| 
    @remark.remark_users.create!(user_id: user_id) 
    end 
end 
+1

Спасибо! Он начинает работать, это экономит пользователей. Но когда я сниму флажок пользователя, он не удаляет ассоциацию из таблицы соединения. Я добавил скрытое поле в форме: '<% = hidden_field_tag ​​'user_ids []', ''%>'. –

+0

Наконец-то получил! Сначала я не понял, что вы подразумеваете под _redirect_to root_path_, но теперь я это делаю. Отлично работает! –

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