如何在单击复选框时更新绑定的属性?

时间:2010-12-07 20:28:51

标签: ruby-on-rails ajax ruby-on-rails-3 checkbox

首先,请提前感谢您的关注:我在Rails中非常棒,我遇到的问题似乎并不困难,但我遇到了一些麻烦。

以下是我的问题:我正在使用以下部分显示“建议”列表:

<table class="recommendations" summary="User recommendations">
    <%= render @recommendations%>
</table>

它为每个已发布的“建议”调用下一个部分:

<tr>
    <td class="recommendations">
 <span class="content">
            <%= wrap(recommendation.content)%>
        </span>
 <span class="timestamp">
            Posted <%=time_ago_in_words(recommendation.created_at)%> ago.
 </span>
    </td>
    <td>
 <%= form_for current_user.recommendations.find(:id => recommendation.id) do |f| %>
     <label>Display</label><%= f.check_box :displayed, :onclick => "update"%>
 <% end %>
    </td>
</tr>

因此,我想在复选框中绑定recommendation.displayed属性,并在选中复选框时自动更新推荐资源。

目前,我无法访问相应的“推荐”实例以传递给form_for,因为我遇到以下错误:

Unknown key(s): id

然后我不确定

:onclick => "update"

将执行我想要做的事情:调用其余的“PUT”方法来更新数据库中的资源。

你能帮我吗?

1 个答案:

答案 0 :(得分:1)

好的,现在我已经完成了。

Rails可以管理check_box上的已检查操作,但不管理未选中的操作。这解释了之前的行为。

我改变了方法,我使用了link_to和image_tag。这是代码:

<td>
    <label>Display</label>  
<% if (recommendation.displayed?) %>
<%= link_to image_tag("checked.png", :border=>0), :action => :hide, :id => recommendation %>
<% else %>
<%= link_to image_tag("unchecked.png", :border=>0), :action => :display, :id => recommendation %>
<%end%>
</td>

在控制器中:

def display
  @recommendation.displayed = true
  unless @recommendation.save
    flash[:error] = "Error displaying the recommendation."
  end
  redirect_back_or current_user 
end

def hide
  @recommendation.displayed = false
  unless @recommendation.save
    flash[:error] = "Error hiding the recommendation."
  end
  redirect_back_or current_user 
end

具体路线:

get 'recommendations/display/:id', :to => "recommendations#display"
get 'recommendations/hide/:id', :to => "recommendations#hide"

现在工作正常。