如何在 RoR 中将字符串属性呈现为 URL
How to render a string attribute as URL in RoR
在 RoR 教程之后,我正在构建一个基本的书签应用程序。
我有两个模型,topic
和 bookmark
。
书签具有 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
在 RoR 教程之后,我正在构建一个基本的书签应用程序。
我有两个模型,topic
和 bookmark
。
书签具有 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