0

iveはfriendly_idとpaperclipを使用するように私のレールアプリを設定して、移行を使用して 'デザイン'データベーステーブルにスラグカラムを追加しました。私は、新しいデザインのポストを作成し、(ペーパークリップを使用して)私の画像をアップロードすると、私はデータベースをチェックして、私は次のように言って、アクティブなレコードのエラーを取得する際にslugカラムは更新されません。Railsのアクティブレコード::フレンドリーなIDとスラッグの認識

enter image description here

をここにあります私のコードスニペット:

モデル:

class Design < ApplicationRecord 
 
    attr_accessor :slug 
 
    extend FriendlyId 
 
    friendly_id :img_name, use: [:slugged, :finders] 
 
    has_attached_file :image, styles: { 
 
    :thumb => ['100x100#', :jpg, :quality => 70], 
 
    :preview => ['480>',  :jpg, :quality => 70], 
 
    :large => ['800>',  :jpg, :quality => 30], 
 
    :retina => ['1200>',  :jpg, :quality => 30] 
 
}, 
 
:convert_options => { 
 
    :thumb => '-set colorspace sRGB -strip', 
 
    :preview => '-set colorspace sRGB -strip', 
 
    :large => '-set colorspace sRGB -strip', 
 
    :retina => '-set colorspace sRGB -strip -sharpen 0x0.5' 
 
} 
 
    validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/ 
 
end

コントローラー:

class DesignsController < ApplicationController 
 
    before_action :find_design, only: [:show, :edit, :update, :destroy] 
 
    before_action :authenticate_user!, except: [:index, :show] 
 

 
    def index 
 
    @designs = Design.all.order("created_at desc") 
 
    end 
 

 
    def new 
 
    @design = Design.new 
 
    end 
 

 
    def create 
 
    @design = Design.new(design_params) 
 

 
    if @design.save 
 
     redirect_to @design, notice: "Hellz yeah, Steve! Your artwork was successfully saved!" 
 
    else 
 
     render 'new', notice: "Oh no, Steve! I was unable to save your artwork!" 
 
    end 
 
    end 
 

 
    def show 
 
    end 
 

 
    def edit 
 
    end 
 

 
    def update 
 
    if @design.update design_params 
 
     redirect_to @design, notice: "Huzzah! Your artwork was successfully saved!" 
 
    else 
 
     render 'edit' 
 
    end 
 
    end 
 

 
    def destroy 
 
    @design.destroy 
 
    redirect_to designs_path 
 
    end 
 

 
    private 
 

 
    def design_params 
 
    params.require(:design).permit(:img_name, :slug, :image, :caption) 
 
    end 
 

 
    def find_design 
 
    @design = Design.friendly.find(params[:id]) 
 
    end 
 
end

ビュー(#show)

<div id="post_show_content" class="skinny_wrapper wrapper_padding"> 
 
    <header> 
 
     <p class="date"><%= @design.created_at.strftime("%A, %b %d") %></p> 
 
     <h1><%= @design.img_name %></h1> 
 
     <hr> 
 
    </header> 
 
      <%= image_tag @design.image.url(:retina), class: "image" %> 
 
     <div class="caption"> 
 
      <p><%= @design.caption %></p> 
 
     </div> 
 

 
    <% if user_signed_in? %> 
 
     <div id="admin_links"> 
 
     <%= link_to "Edit Artwork", edit_design_path(@design) %> 
 
     <%= link_to "Delete Artwork", design_path(@design), method: :delete, data: {confirm: "Are you sure?" } %> 
 
     </div> 
 
    <% end %> 
 

 
    
 

 
</div>

移行:

class AddSlugToDesigns < ActiveRecord::Migration[5.0] 
 
    def change 
 
    add_column :designs, :slug, :string 
 
    add_index :designs, :slug, unique: true 
 
    end 
 
end

+0

フレンドリーIDについてはわかりませんが、activerecord find_by 'Design.find_by(slug:params [:id])を使用して動作させることができます。 – sa77

+0

歓声 - どのファイルに追加しますか? – sdawes

+0

コントローラーのfind_designアクションの代わりに '@design = Design.find_by(slug:params [:id]) 'を入力してください – sa77

答えて

0

使用ActiveRecordのfind_by方法は、スラグを使用してモデルを見つけます。あなたのfind_design方法は、あなたが定義していない、あなたの設計モデルでこの

class DesignsController < ApplicationController 
    def find_design 
    @design = Design.find_by(slug: params[:id]) 
    end 
end 

のように見えますimg_name(それはメソッド呼び出しの)あなたがモデルdesign.rbに以下を追加friendly_id :img_name, use: [:slugged, :finders] に言及している

def img_name 
    self.img_name 
end 

friendly_id gemの使用をスキップして、ランダムスラッグを生成してbefore_validationという独自のメソッドを作成する方法もあります。あなたは、移行前に実行するスラグ

+0

投稿を作成した後にデータベースをチェックすると、スラグの列にデータがなく、単にNULLと表示されることが多いと思います。だから何らかの理由で私が新しいデザインを作成するときに... .../designsとsubmitするとデータベースに追加されますが、slugフィールドはNULLです。 – sdawes

+0

なので、 'Design.find_each(&:save)'をレールコンソールで実行しようとしましたが、これで問題が解決されませんでした。 – sdawes

+0

モデルに 'img_name'メソッドを追加してみてください。 – sa77

0

実行rails generate friendly_idでDBを照会する必要がある場所

before_validation :set_slug, :on => :create 

def set_slug 
    random_token = SecureRandom.hex(3) 
    self.slug = "#{self.img_name.downcase}_#{random_token}" 
end 

のようなものは、あなたのコントローラ上Design.find_by(slug: params[:id])を使用しています。これまでデータベース内の他のモデルやテーブルでこれを行っていましたが、新しいテーブルの新しいスラッグの移行を実行する前に、これを再度実行する必要があります。

関連する問題