¿Cuál es la función def to_s?

Estoy revisando la sección “Etiquetas” del tutorial de Blogger y estoy un poco confundido en una parte: la función def to_s (en tag.rb); Por qué se requiere y cómo se incluye.

He incluido algunas partes relevantes de los archivos relevantes para el contexto.

Los modelos

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 

tag.rb

 class Tag < ActiveRecord::Base has_many :taggings has_many :articles, through: :taggings def to_s name end end 

tagging.rb

 class Tagging < ActiveRecord::Base belongs_to :tag belongs_to :article end 

Los controladores

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 

Ayudantes

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 

PUNTOS DE VISTA

new.html.erb

  

show.html.erb

Etiquetas:

Tengo tu punto. Cuando concatena un valor en cadena, debe escribir, por ejemplo,

 "hello #{@user.name}" 

Entonces, en lugar de llamar a @usuario.nombre u, puede especificar lo que tenga que mostrar al usuario como una cadena que puede especificar directamente en el método to_s para que no tenga que llamar .to_s nuevamente, simplemente escriba

 "hello #{@user}" 

por encima de la línea de código busque el método .to_s para @ la clase del usuario e imprima el valor de retorno.

lo mismo es para enrutamiento como

 user_path(@user) 

le dará >> users / 123 # donde 123 es id de @user

Si tú escribes

 def to_params self.name end 

Luego le dará a >> users / john # donde john es el nombre del usuario @

to_s es el método estándar de Ruby para convertir un objeto en una cadena. Usted define to_s cuando quiere una representación de cadena personalizada para su clase. Ejemplo:

 1.to_s #=> "1" StandardError.new("ERROR!").to_s #=> "ERROR!" 

Y así.

to_s es una función que devuelve la cadena equivalente del objeto.

En este caso, tiene Tag.to_s definido, lo que le permite hacer algo como esto

 tag = Tag.new(:name => "SomeTag") tag.to_s #=> "SomeTag" 

Puede agregar más lógica a to_s para tener una cadena más amigable, en lugar de un to_s de objeto cuando desee una cadena desde una etiqueta (por ejemplo, mientras imprime en la consola).