如何在 RoR 中将字符串属性呈现为 URL

How to render a string attribute as URL in RoR

在 RoR 教程之后,我正在构建一个基本的书签应用程序。

我有两个模型,topicbookmark

书签具有 url 属性。 url 属性在我的 topics#show 上呈现良好,但显示为纯文本。当我尝试将其呈现为 link 时,它没有正确地 link 到 url。

如何将其渲染为 hyperlink?

我试过了

<%= @topic.bookmarks.each do |bookmark| %>
<a href="#{bookmark.url}">bookmark.url</a>
<% end %>

但显然这看起来不对。我插值的方式正确吗?

或者是否有 rails 辅助方法可以解决问题?

这是我的文件

主题控制器

class TopicsController < ApplicationController

 def index
   @topics = Topic.all
 end

 def new
   @topic = Topic.new
 end

 def show
   @topic = Topic.find(params[:id])  
 end

 def create
   @topic = Topic.new(params.require(:topic).permit(:name))
   if @topic.save
     redirect_to @topic
   else
     render :new
   end
 end

结束

我的书签控制器

class BookmarksController < ApplicationController

 def create
   @topic = Topic.find(params[:topic_id])
   @bookmarks = @topic.bookmarks
   @bookmark = @topic.bookmarks.build(params.require(:bookmark).permit(:url, :topic_id))
   @bookmark.topic = @topic
   @new_bookmark = Bookmark.new
   if @bookmark.save
     flash[:notice] = "Bookmark was saved"
     redirect_to @topic
   else
     flash[:error] = "There was an error, please try again later"
     redirect_to @topic
   end
 end

 def destroy
   @topic = Topic.find(params[:topic_id])
   @bookmark = Bookmark.find(params[:id])
   @bookmark.topic = @topic

   if @bookmark.destroy
     flash[:notice] = "Bookmark was destroyed successfully"
     redirect_to [@topic]
   else
     flash[:error] = "There was an error, please try again later"
   end
 end

结束

这些是我的迁移文件

class CreateTopics < ActiveRecord::Migration
  def change
    create_table :topics do |t|
      t.string :name

      t.timestamps
    end
  end
end


class CreateBookmarks < ActiveRecord::Migration
  def change
    create_table :bookmarks do |t|
      t.string :url
      t.references :topic, index: true

      t.timestamps
    end
  end
end

这是我的路线文件

Rails.application.routes.draw do



  resources :topics do
    resources :bookmarks, only: [:destroy, :create]
  end

  get 'about' => 'welcome#about'



  root to: 'welcome#index'
end

topics#show

中显示的部分书签形式
<%= form_for [@topic, @topic.bookmarks.new] do |f| %>
 <div class="col-md-5">
   <div class="form-group">
    <%= f.text_field :url, placeholder: "Enter bookmark url", class: 'form-control' %>
 </div>
    <%= f.submit "save", class: 'form-control' %>
 </div>
<% end %>

topics#show 中添加了这一行以呈现部分

<%= render partial: 'bookmarks/form', locals: { topic: @topic, bookmark: @bookmark} %>

你试过使用助手link_to吗?

<%= link_to 'name', bookmark.url, class: 'btn btn-default' %>

ERB 不会插入字符串,除非它们在 ERB 块内 (<% ... %>)。

即,在您的情况下,以下方法可行:

<a href="<%= bookmark.url %>">bookmark.url</a>

更简洁的解决方案是使用另一个答案中提到的 link_to。我只是认为了解为什么原始解决方案不起作用很重要。

您可以使用 link_to 辅助方法:

<%= @topic.bookmarks.each do |bookmark| %>
  <%= link_to bookmark.url, bookmark.url %>
<% end %>

更多信息here