在我的一个索引操作中,我想显示一个“激活”或“取消激活”的链接,具体取决于记录是否处于活动状态。
当用户点击特定记录的“激活”或“取消激活”链接时,应该调用我的更新操作,相应地更新记录,如果链接说“激活”,则应该是改为“取消激活”,反之亦然。
我怎么能实现这个目标?我查看了link_to_remote
,但我不知道如何切换链接的文本。
答案 0 :(得分:1)
可以使用link_to_remote,然后必须在控制器中响应js格式并发送js代码以通过页面更新执行:
update_page do |page|
page.replace_html 'link_id', "<a href='#'>OtherState</a>"
page.visual_effect :highlight, 'link_id' # you can highlight the item to give more feedback to the user
end
答案 1 :(得分:1)
在我看来,我把它放在了:
<% for account in @accounts %>
<tr id="<%= "update[#{account.id}]" %>">
<%= render :partial => "account", :object => account %>
</tr>
<% end %>
在我的更新操作中,我把它放在:
def update
@account = Account.find(params[:id])
respond_to do |format|
if @account.update_attributes(params[:account])
format.html do redirect_to(@account)
flash[:notice] = 'Account was successfully updated.'
end
format.xml { head :ok }
format.js { render :partial => 'account' }
else
format.html { render :action => "edit" }
format.xml { render :xml => @account.errors, :status => :unprocessable_entity }
end
end
end
在我的部分中我把它放在了:
<td><%=h account.email %></td>
<td><%=h account.password %></td>
<td><%=h account.get_status %></td>
<td><%=h account.network.name %></td>
<td>
<%=
link_to_remote(
# name
account.get_status == :active ? 'De-activate' : 'Activate',
# options = {}
{
:url =>
{
:controller => "accounts",
:action => :update,
:id => account.id,
:account => { :status => account.get_status == :active ? account.find_status(:inactive) : account.find_status(:active) }
},
:method => :put,
:update => "update[#{account.id}]",
},
{
:with => "'account[status]=' + $('account['status']).value"
}
)
%>
</td>
<td><%= link_to 'Edit', edit_account_path(account) %></td>
<td><%= link_to 'Destroy', account, :confirm => 'Are you sure?', :method => :delete %></td>
从link_to_remote
向您的行动发送参数时,文档不是很明确。您要发送到更新操作的参数,您将放入options
link_to_remote
哈希值,并且在点击链接时,我的记录会成功更新。
此外,对于链接文本的实际“切换”,name
link_to_remote
参数中的三元条件就是诀窍。