2

これは、モデル内で使用しているものです

これは、API を介して別のサード パーティの Web サイトに投稿される URL です。

投稿モデル (post.rb)

"#{content.truncate(200)}...more http://domain.com/post/#{id.to_s}"

「id」は投稿IDを指しています。それをランダムな8桁の英数字に変換するにはどうすればよいですか?

現在、人々が変更できるものとして表示されていますhttp://domain.com/post/902

私が欲しいhttp://domain.com/post/9sd98asj

おそらく次のようなものを使用する必要があることはわかっていますSecureRandom.urlsafe_base64(8)が、どこでどのように設定できますか?

これは私がroutes.rbに持っているものです

match '/post/:id', :to => 'posts#show', via: :get, as: :post
4

2 に答える 2

10

にアトリビュートを 1 つだけ追加する必要がありますpost。属性名はpermalink.

実行してみてください:

rails g migration add_permalink_to_posts permalink:string
rake db:migrate

選択できる2 つのアクティブ レコード コールバックbefore_saveがあります:またはbefore_create(両方の違いを確認してください)。この例では、before_saveコールバックを使用しています。

注:Rails 3.xの場合

class Post < ActiveRecord::Base
  attr_accessible :content, :permalink
  before_save :make_it_permalink

 def make_it_permalink
   # this can create a permalink using a random 8-digit alphanumeric
   self.permalink = SecureRandom.urlsafe_base64(8)
 end

end

urlsafe_base64

そしてあなたのroutes.rbファイルで:

match "/post/:permalink" => 'posts#show', :as => "show_post"

posts_controller.rb

def index
 @posts = Post.all
end

def show
  @post = Post.find_by_permalink(params[:permalink])
end

最後に、ビュー ( index.html.erb)を示します。

<% @posts.each do |post| %>
<p><%= truncate(post.content, :length => 300).html_safe %>
   <br/><br/>
   <%= link_to "Read More...", show_post_path(post.permalink) %></p>
<% end %>
于 2013-04-19T03:16:48.010 に答える
3

Rails の主キーを文字列に変更する」は、あなたの質問に関連しています。

私は...するだろう:

  • デフォルトの ID をテーブルに残す
  • リソースルートを定義せず、必要なものを match で記述します (のようにmatch '/post/:code')
  • controller#show、 を使用しますPost.find_by_code(params[:code])
于 2013-04-19T03:17:53.927 に答える