Ruby on Rails心愿单应用完整HTTP路径渲染异常问题
Rails Wishlist应用Show视图无法渲染完整HTTP路径的问题解决
问题
用Ruby on Rails开发的wishlist应用,创建心愿单后能正常显示完整HTTP URL,但进入单个心愿单的#show视图时,相同的link_to代码只能渲染出相对路径,无法显示完整HTTP路径。
原因
控制器的show动作中未定义@show_url变量。只有create动作里生成了这个包含完整域名的URL变量,show动作没有初始化该变量,导致视图中@show_url为nil,link_to方法会自动把第二个参数(相对路径)当作显示文本输出。
解决方案
方案1:在show动作中初始化@show_url变量
修改WishlistsController的show方法,添加@show_url的生成逻辑:
def show @wishlist = Wishlist.find(params[:id]) @show_url = url_for(controller: 'wishlists', action: 'show', id: @wishlist.id, only_path: false) end
方案2:直接在视图中生成完整URL(推荐)
不需要依赖控制器变量,直接在show视图中使用Rails路由助手生成完整URL,替换原来的link_to代码:
<p><%= link_to wishlist_url(@wishlist), @wishlist %></p>
wishlist_url是Rails自动生成的路由助手,会返回包含完整域名的URL,对应相对路径助手wishlist_path。
也可以用url_for方法实现:
<p><%= link_to url_for(@wishlist, only_path: false), @wishlist %></p>
补充优化
创建动作里的代码也可以优化成使用wishlist_url,让代码更简洁:
def create @wishlist = Wishlist.new(wishlist_params) if @wishlist.save @show_url = wishlist_url(@wishlist) render :show_url else render :new, status: :unprocessable_entity end end
内容的提问来源于stack exchange,提问作者Aly Dabbous
相关产品推荐
相关产品推荐

