Rails 4 has_many:通过w / check_box_tag - 只有关联的一方被保存到连接表

时间:2014-04-07 06:39:25

标签: ruby-on-rails ruby

我是Rails的新手,我一直试图以各种方式扩展Michael Hartl的教程。其中之一是使用has_many:through关联来模拟用户兴趣。我设置了以下模型:

class Interest < ActiveRecord::Base
    has_many :user_interests, dependent: :destroy
    has_many :users, through: :user_interests
end

class User < ActiveRecord::Base
    has_many :user_interests, dependent: :destroy
    has_many :interests, through: :user_interests
end

class UserInterest < ActiveRecord::Base
    belongs_to :user    
    belongs_to :interest
end

我的user_interests控制器:

def index
end

def create
    @user_interest = current_user.user_interests.build(params[:interest_ids])
    if @user_interest.save
        redirect_to current_user
        flash[:success] = "Interests updated!"
    else
        render 'index'
    end
end

def destroy
    @user_interest = UserInterest.find(params[:user_id][:interest_ids])
    current_user.user_interests(@user_interest).destroy
end

观点:

<%= form_for(current_user.user_interests.build(params[:interest_ids])) do |f| %>
    <%= hidden_field_tag "user[interest_ids][]", nil %>
    <% Interest.all.each do |interest| %>
        <%= check_box_tag "user[interest_ids][]", interest.id, current_user.interest_ids.include?(interest.id), id: dom_id(interest) %>
        <%= label_tag dom_id(interest), interest.activity %><br>
    <% end %>
    <%= f.submit "Update interests", class: "btn btn-large btn-primary" %>
<% end %>

当我运行应用程序时,我可以选中一个复选框并单击提交按钮,但只有用户ID保存在user_interests表中。所以它看起来像:

id integer    user_id    interest_id    created_at_timestamp    updated_at_timestamp
    1           2155                      2014-04-06 ect...       2014-04-06 ect...

起初我试图使用用户控制器来创建关联,但这导致了问题,因为我没有在用户#edit动作上显示兴趣复选框,我希望他们拥有自己的页面。我需要做些什么来将兴趣ID与用户ID一起保存到user_interests表?

1 个答案:

答案 0 :(得分:0)

请尝试使用以下代码。

def create
   interests = Interest.where(id: params[:user][:interest_ids])
   current_user.interests.push(interests)
   flash[:success] = "Interests updated!"
   redirect_to current_user
end