0

レールのチュートリアルに続いて、method: :deleteアクションを試行したときにこのエラーが発生します。レールがSQLite localhostをHerokuに移植しないPGSQL

ActiveRecord::StatementInvalid (PG::DatatypeMismatch: ERROR: argument of WHERE must be type boolean, not type integer

これは私の破壊方法です。

def destroy 
@user_stock = current_user.user_stocks.where(stock_id: params[:id]).first 
@user_stock.destroy 
respond_to do |format| 
    format.html { redirect_to my_portfolio_path, notice: "#{@user_stock.stock.ticker} was removed from portfolio." } 
    format.json { head :no_content } 
end 
end 

私は右に使用する必要がhereについてfindfind_by上の質問を読んで、それはちょうど私を混乱。

UserStocksController

class UserStocksController < ApplicationController 
 
    before_action :set_user_stock, only: [:show, :edit, :update, :destroy] 
 

 
    # GET /user_stocks 
 
    # GET /user_stocks.json 
 
    def index 
 
    @user_stocks = UserStock.all 
 
    end 
 

 
    # GET /user_stocks/1 
 
    # GET /user_stocks/1.json 
 
    def show 
 
    end 
 

 
    # GET /user_stocks/new 
 
    def new 
 
    @user_stock = UserStock.new 
 
    end 
 

 
    # GET /user_stocks/1/edit 
 
    def edit 
 
    end 
 

 
    # POST /user_stocks 
 
    # POST /user_stocks.json 
 
    def create 
 
    if params[:stock_id].present? 
 
     @user_stock = UserStock.new(stock_id: params[:stock_id], user: current_user) 
 
    else 
 
     stock = Stock.find_by_ticker(params[:stock_ticker]) 
 
     if stock 
 
     @user_stock = UserStock.new(user: current_user, stock: stock) 
 
     else 
 
     stock = Stock.new_from_lookup(params[:stock_ticker]) 
 
     if stock.save 
 
      @user_stock = UserStock.new(user:current_user, stock: stock) 
 
     else 
 
      @user_stock = nil 
 
      flash[:error] = "Stock is not available" 
 
     end 
 
     end 
 
    end 
 
    
 
    respond_to do |format| 
 
     if @user_stock.save 
 
     format.html { redirect_to my_portfolio_path, notice: "Stock #{@user_stock.stock.ticker} was saved" } 
 
     format.json { render :show, status: :created, location: @user_stock } 
 
     else 
 
     format.html { render :new } 
 
     format.json { render json: @user_stock.errors, status: :unprocessable_entity } 
 
     end 
 
    end 
 
    end 
 

 
    # PATCH/PUT /user_stocks/1 
 
    # PATCH/PUT /user_stocks/1.json 
 
    def update 
 
    respond_to do |format| 
 
     if @user_stock.update(user_stock_params) 
 
     format.html { redirect_to @user_stock, notice: 'User stock was successfully updated.' } 
 
     format.json { render :show, status: :ok, location: @user_stock } 
 
     else 
 
     format.html { render :edit } 
 
     format.json { render json: @user_stock.errors, status: :unprocessable_entity } 
 
     end 
 
    end 
 
    end 
 

 
    # DELETE /user_stocks/1 
 
    # DELETE /user_stocks/1.json 
 
    def destroy 
 
    @user_stock = current_user.user_stocks.where(stock_id: params[:id]).first 
 
    @user_stock.destroy 
 
    respond_to do |format| 
 
     format.html { redirect_to my_portfolio_path, notice: "#{@user_stock.stock.ticker} was removed from portfolio." } 
 
     format.json { head :no_content } 
 
    end 
 
    end 
 

 
    private 
 
    # Use callbacks to share common setup or constraints between actions. 
 
    def set_user_stock 
 
    @user_stock = UserStock.find_by(params[:id]) 
 
    end 
 

 
    # Never trust parameters from the scary internet, only allow the white list through. 
 
    def user_stock_params 
 
     params.require(:user_stock).permit(:user_id, :stock_id) 
 
    end 
 
end

my_portfolioビューは、部分_list

<table class="table table-striped"> 
 
\t <thead> 
 
\t \t <tr> 
 
\t \t \t <th>Name</th> 
 
\t \t \t <th>Symbol</th> 
 
\t \t \t <th>Current Price</th> 
 
\t \t \t <% if @user.id == current_user.id%> 
 
\t \t \t <th>Actions</th> 
 
\t \t \t <%end%> 
 
\t \t </tr> 
 
\t </thead> 
 
\t <tbody> 
 
\t \t <%@user_stocks.each do |us|%> 
 
\t \t <tr> 
 
\t \t \t <td><%=us.name%></td> 
 
\t \t \t <td><%=us.ticker%></td> 
 
\t \t \t <td><%=us.price%></td> 
 
\t \t \t <% if @user.id == current_user.id%> 
 
\t \t \t <td> 
 
\t \t \t \t <%= link_to 'Delete', user_stock_path(us), :method => :delete, 
 
\t \t \t \t \t \t \t \t \t \t \t \t \t \t :data => {:confirm => "You sure you want to delete #{us.name} from your portfolio?"}, 
 
\t \t \t \t \t \t \t \t \t \t \t \t \t \t :class => "btn btn-xs btn-danger"%> 
 
      </td> 
 
\t \t \t <%end%> 
 
\t \t </tr> 
 
\t \t <%end%> 
 
\t </tbody> 
 
</table>
をレンダリング

答えて

0

あなたの問題は、おそらくあなたのset_user_stock方法であり、 UserStock.find_by(params[:id])は言うだけの短い方法です:

UserStock.where(params[:id]).first 

のでparams[:id]は、たとえば、ある6場合、あなたはこのSQLを送信してしまいますデータベース:

select * 
from user_stocks 
where 6 

とあなたのエラーがあります:6は、SQLのboolean値ではなく、where 6は意味がありません。 SQLiteのSQLの解釈はむしろ緩いので、where 6のようなナンセンスを受け入れるでしょうが、PostgreSQLは正しく文句を言います。

2回のレッスンがここにあります

  1. あなたset_user_stock方法は次のようになります。あなたはいつもに期待している場合findバージョンを使用してください

    def set_user_stock 
        @user_stock = UserStock.find(params[:id]) 
    end 
    

    または

    def set_user_stock 
        @user_stock = UserStock.find_by(:id => params[:id]) 
    end 
    

    有効なでset_user_stockに電話してくださいあなた自身@user_stock.nil?に対処したい場合はとfind_byを入力してください。

  2. 1つのデータベースの上で開発し、別のデータベースに展開することは決してありません。もしあなたがSQLite上で開発し、他のものに展開しようとしているならば、恐らくそうです。 常には、同じデータベースを使用して(データベースバージョンまで)開発、テスト、および展開する必要があります.ActiveRecordは、データベースポータビリティの困難な部分からあなたを守りません。

+0

あなたは本当のmvpです – Jack

1

私はこれが私の推測です。ここでも、あなただけので、私はこのすべてがどのように関係するかわからないが、私の推測では、あなたがこのようにIDを追加することである部分を掲示:

def set_user_stock 
    @user_stock = UserStock.find_by(params[:id]) 
end 

<%= link_to 'Delete', user_stock_path(id: us.id), :method => :delete, 
                 :data => {:confirm => "You sure you want to delete #{us.name} from your portfolio?"}, 
                 :class => "btn btn-xs btn-danger"%> 
+0

未定義のメソッドstockhid – Jack

+0

コントローラ全体を投稿できますか? – codigomonstruo

+0

ちょうど私の質問でそれをしました – Jack

関連する問題