使用 HABTM 关系更新复选框的值——Rails

Posted

技术标签:

【中文标题】使用 HABTM 关系更新复选框的值——Rails【英文标题】:update values of checkbox with HABTM relationship -- Rails 【发布时间】:2011-01-16 19:50:06 【问题描述】:

大家好,我一直在使用 has_and_belongs_to_many 与 Railscast Episode #17 中的复选框示例的关系。我遇到了一些问题,现在一切都很顺利,除了更新按钮不起作用。

编辑视图看起来像这样

<% form_for :users, :action => 'update'  do |f| %>
<% for interest in Interest.find(:all) %>
<div>
<%= check_box_tag "user[interest_ids][]", interest.id,
              @user.interests.include?(interest) %>
<%= interest.name %>
</div>
<% end %>
<p>
<%= f.submit 'Update' %>
</p>
<% end %>

在控制器中我有....

def edit
  @user = User.find(session[:user_id])
end

 def update
  params[:user][:interest_ids] ||= []
  @user = User.find(session[:user_id])
  if @user.update_attributes(params[:user])
  flash[:notice]='User data was updated'
  redirect_to :action => 'index'
 else
  redirect_to :action => 'index'
 end  
end

按钮不是进行重定向的事件...所以我不知道发生了什么。我的表单创建中有什么东西搞砸了吗?我不确定如何创建一个按钮并让它通过模型更新等访问控制器中的方法。

我环顾四周寻求帮助,并认为可能是因为 attr_accessible 所以我添加了 =>

 attr_accessible :login, :email, :password, :password_confirmation, :interest_ids, :user

到我的用户模型,但仍然没有...我知道为什么我的表单没有提交吗?

【问题讨论】:

【参考方案1】:

我玩弄了表单,正确的代码是这个 ==>

<% form_for @user do |f| %>
<% for interest in Interest.find(:all) %>
<div>
 <%= check_box_tag "user[interest_ids][]", interest.id, @user.interests.include?(interest) %>
 <%= interest.name %>
</div>
<% end %>
<p>
<%= f.submit 'Edit' %>
</p>
<% end %>

我很高兴!所以显然问题是 :user 应该是 @user 对象。

【讨论】:

这不处理你没有选中它们的情况。 当我们有所有未检查的rails时将删除所有关系【参考方案2】:

check_box 标签必须如下所示才能正常工作:

<%= check_box "user", "user_interest_ids", :checked => @user.interests.include?(interest), :name => 'user[interest_ids][]', interest.id, nil %>

在我的广告 ad_sizes habtm 关系中,我正在使用此代码:

<% @ad_sizes.each do |s| %>
<li>
<%= check_box "ad", "ad_size_ids", :checked => @ad.ad_sizes.include?(s), :id => "ad_size_#s.name", :class => 'checkbox', :name => 'ad[ad_size_ids][]', s.id, nil %>
<label class="checkbox" for="<%= "ad_size_#s.name" %>"><%= s.description %></label>
</li>
<% end %>

【讨论】:

但是railscast中的代码不是吗???我试过你的代码,它没有工作。什么都没有更新,我感觉它与表单中的某些东西有关,因为它在单击按钮后没有做任何重定向。 代码类似,没错。顺便说一句,您的 form_for 定义中有一个错误。它应该是&lt;% form_for :user, :action =&gt; 'update' do |f| %&gt; 对,我的意思是为什么 Railscast 中没有该代码?我调整了 form_for 但您提供的 sn-p 似乎不起作用。我想知道为什么它仍然没有做任何重定向。 您需要更具体。你有什么错误?如果没有错误,那么点击更新后的params 变量值是多少? 这不会处理您将它们全部取消选中的情况。

以上是关于使用 HABTM 关系更新复选框的值——Rails的主要内容,如果未能解决你的问题,请参考以下文章

Rails,Ransack:如何在 HABTM 关系中搜索“所有”匹配项而不是“任何”匹配项

Rails:在 HABTM 关系中将子项从大型记录集添加到父模型的 UI

Rails 搜索 HABTM 关系中的关联模型

HABTM 多态关系

Rails - 仅根据具体情况引入一些 HABTM 关联,​​以避免不必要的连接

Cakephp habtm 关系更新而不是保存