我已经被困在这几天了,我担心我没有足够的词汇来正确地提出这个问题,但是非常感谢任何反馈!
我正在开发一个基本的博客网站。用户可以创建具有标题,描述的帖子,并声明其他人是否可以看到帖子(公共或私人)。从索引页面,我希望用户能够看到他们的帖子列表,切换public | private,并删除帖子。列表很简单(我根据用户的帖子呈现部分内容),并且AJAX删除链接运行良好:
<%= link_to 'Delete Post', post, :confirm => 'Are you sure?', :method => :delete, :remote => true %>
切换public | private对应于编辑/更新操作,我无法弄清楚如何使用链接或按钮执行此操作 - 似乎我必须使用表单。我已经尝试了很多工作删除按钮的变体,看起来像这样(并且没有工作):
<%= link_to 'Make Public', { :controller => "posts", :action => "update", :id => post, :public => true, :post => post }, :method => :put, :remote => true %>
似乎工作的唯一方法是使用表单,但这需要用户单击Update Post
按钮:
<%= form_for(post, :remote => true) do |f| %>
<div class="field">
<%= f.label :public %><br />
<%= f.check_box :public %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
那么,在Rail3中,更新单个属性的正确方法是什么? (是否有更合适的措辞?)可以使用链接或按钮完成吗?我必须使用表格吗?是否有Rails3方式(如destroy.js.erb)添加onclick / onchange事件或者我是否需要开发自己的JavaScript?
Zabba的答案很棒;但是,我最终使用了一个通过JavaScript(特别是jQuery)提交的隐藏表单。
在视图中:
<div>
<%= form_for(post, :remote => true) do |f| %>
<%= f.hidden_field :public, { :value => !post.public } %>
<% end %>
<% if post.public == true %>
<div class="pp">Public</div>
<% else %>
<div class="pp">Private</div>
<% end %>
</div>
JavaScript:
$('.pp').live('click', function(){
$(this).siblings('form').submit();
});
对这两种方法的评论?还有一个惯用的吗?
答案 0 :(得分:4)
我会这样做(没有经过测试,可能会出现一些小错误):
在make_public
PostsController
的操作
一个。链接“将是:&lt;%= button_to'公开',:确认=&gt;'你确定吗?',:method =&gt;:put,:remote =&gt; true%&gt;
湾该操作将收到帖子的ID(params[:id]
)
在Post模型上定义一个名为make_public
的方法
一个。致电update_attributes :make_public => true
执行更新的链接应该是PUT 而不是 GET(始终将所有状态更改操作放在POST或PUT后面)