什么是def to_s功能?

bwo*_*bst 2 ruby ruby-on-rails

我正在阅读Blogger教程的"标签"部分,我对一部分感到困惑:def to_s函数(在tag.rb中); 为什么需要它以及如何包含它.

我已经为相关文件中包含了相关文件的一些相关部分.

楷模

article.rb

class Article < ActiveRecord::Base
  attr_accessible :tag_list
  has_many :taggings
  has_many :tags, through: :taggings

  def tag_list
    return self.tags.collect do |tag|
      tag.name
    end.join(", ")
  end

  def tag_list=(tags_string)
    self.taggings.destroy_all

      tag_names = tags_string.split(",").collect{|s| s.strip.downcase}.uniq

      tag_names.each do |tag_name|
        tag = Tag.find_or_create_by_name(tag_name)
        tagging = self.taggings.new
        tagging.tag_id = tag.id
      end
    end
  end
Run Code Online (Sandbox Code Playgroud)

tag.rb

class Tag < ActiveRecord::Base
  has_many :taggings
  has_many :articles, through: :taggings

  def to_s
    name
  end
end
Run Code Online (Sandbox Code Playgroud)

tagging.rb

class Tagging < ActiveRecord::Base
  belongs_to :tag
  belongs_to :article
end
Run Code Online (Sandbox Code Playgroud)

CONTROLLERS

tags_controller.rb

class TagsController < ApplicationController

  def index
    @tags = Tag.all
  end

  def show
    @tag = Tag.find(params[:id])
  end

  def destroy
    @tag = Tag.find(params[:id]).destroy
    redirect_to :back
  end
end
Run Code Online (Sandbox Code Playgroud)

助手

articles_helper.rb

module ArticlesHelper

  def tag_links(tags)
    links = tags.collect{|tag| link_to tag.name, tag_path(tag)}
    return links.join(", ").html_safe
  end
end
Run Code Online (Sandbox Code Playgroud)

VIEWS

new.html.erb

<%= form_for(@article, html: {multipart: true}) do |f| %>
  <p>
    <%= f.label :tag_list %>
    <%= f.text_field :tag_list %>
  </p>
  <p>
    <%= f.submit %>
  </p>
<% end %>
Run Code Online (Sandbox Code Playgroud)

show.html.erb

标签: <%= tag_links(@article.tags) %>

jbm*_*yid 6

我明白了你的意思.当您在字符串中连接值时,您必须编写例如

"hello #{@user.name}" 
Run Code Online (Sandbox Code Playgroud)

因此,不是调用@ user.name你可以指定任何你必须显示用户的字符串,你可以直接在to_s方法中指定,这样你就不需要再次调用.to_s了

"hello #{@user}"
Run Code Online (Sandbox Code Playgroud)

上面的代码行搜索@ user类的.to_s方法和打印返回值.

同样适用于路由

user_path(@user)
Run Code Online (Sandbox Code Playgroud)

会给你>> users/123 #,其中123是@user的id

如果你写

def to_params
 self.name
end
Run Code Online (Sandbox Code Playgroud)

然后它会给>> users/john#,其中john是@用户的名字