2

Bloggerチュートリアルの「タグ」セクションを読んでいて、1 つの部分で少し混乱しています。def to_s 関数 (tag.rb 内)。なぜそれが必要なのか、どのように含まれているのか。

コンテキストのために、関連ファイルの関連部分をいくつか含めました。

モデル

記事.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

タグ.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

コントローラー

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

ヘルパー

article_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

ビュー

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 %>

show.html.erb

タグ:<%= tag_links(@article.tags) %>

4

3 に答える 3

6

私はあなたのポイントを得ました。文字列で値を連結するときは、たとえば次のように記述する必要があります。

"hello #{@user.name}" 

したがって、@ user.nameを呼び出す代わりに、uは、ユーザーを文字列として表示する必要があるものを指定できます。これにより、to_sメソッドで直接指定できるため、.to_sを再度呼び出す必要はありません。

"hello #{@user}"

上記のコード行で、@ userのクラスの.to_sメソッドを検索し、戻り値を出力します。

同じようなルーティングの場合

user_path(@user)

>> users / 123 #ここで123は@userのIDです

あなたが書くなら

def to_params
 self.name
end

次に、>> users / john#が表示されます。ここで、johnは@userの名前です。

于 2013-03-20T07:52:29.370 に答える
2

to_sObject を文字列に変換するための標準的な Ruby メソッドです。to_sクラスのカスタム文字列表現が必要な場合を定義します。例:

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

等々。

于 2013-03-20T03:13:57.247 に答える
1

to_sオブジェクトに相当する文字列を返す関数です。

この場合、次Tag.to_sのようなことができるように定義しました

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

to_sタグから文字列が必要な場合 (例: コンソールへの出力時) に、オブジェクト ハッシュコードではなく、より使いやすい文字列を取得するためのロジックを追加できます。

于 2013-03-20T03:16:30.153 に答える