2017-08-23 11 views
1

私はfind_byでそれを参照することによってuser_idをparamsに渡すことに問題があります。私は、ユーザーが入力するピン番号を持っています。それが有効であるかどうかを確認するためにチェックされます。そうであれば、そのユーザーのIDを取得し、データベースに保存するためにparamsに配置します。ユーザIDの参照の問題

class InventoriesController < ApplicationController 
before_action :set_inventory, only: [:show, :edit, :update, :destroy] 

    def index 
    @inventories = Inventory.all 
    end 

    def show 

    end 

    def new 
    @inventory = Inventory.new 
    end 

    def edit 
    end 

    def create 
     if @user = User.find_by(pin: params[:pin]) 
     @inventory = Inventory.new(inventory_params) 
     @inventory.user_id = @user.id 
     if @inventory.valid? 
      @inventory.save 

     else 

     end 
     else 

     end 
    end 

    def update 
    respond_to do |format| 
     if @inventory.update(inventory_params) 
     format.html { redirect_to @inventory, notice: 'Inventory was successfully updated.' } 
     format.json { render :show, status: :ok, location: @inventory } 
     else 
     format.html { render :edit } 
     format.json { render json: @inventory.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @inventory.destroy 
    respond_to do |format| 
     format.html { redirect_to inventories_url, notice: 'Inventory was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_inventory 
     @inventory = Inventory.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def inventory_params 
     params.require(:inventory).permit(:eq_type_id, :equipment_id, :chauffeur_id, :user_id) 
    end 

end 

はので、これは=> {user_idは1985年のものではなく、それは私にエラーを与えたときに、私は

「在庫」を参照してくださいので、それはだと仮定することができます保存されませんコントローラ"eq_type_id" => "1"、 "equipment_id" => "1"、 "chauffeur_id" => "1"、 "user_idは" => "1985"}

た私が望む間違った道ハンドルするuser_id d。それは、USER_IDする必要があります。1.

今、私はレールコンソールにアクセスし、

ユーザー= User.find_by(ピン:1985)やっていた場合、私は、ユーザーオブジェクトを取得

を:私は新しい在庫を開始した場合、その後

#<User id: 1, email: "[email protected]", created_at: "2017-08-11 18:39:22", updated_at: "2017-08-11 18:40:22", admin: true, pin: "1985"> 

インベントリ= Inventory.new

私はその後

inventory.user_id = user.id

によってインベントリオブジェクトにUSER_IDを割り当てることができ、在庫オブジェクト

#<Inventory id: nil, eq_type_id: nil, equipment_id: nil, chauffeur_id: nil, created_at: nil, updated_at: nil, user_id: nil> 

を得ます

在庫オブジェクトをもう一度見てみると、署名された

#<Inventory id: nil, eq_type_id: nil, equipment_id: nil, chauffeur_id: nil, created_at: nil, updated_at: nil, user_id: 3> 

今の形で残りは正しくない「ゼロ」を示すに充填されているが、USER_IDはまだいくつかの理由で1985として起動します。だから私はレールのコンソールでそれが動作する理由はわかりませんが、アプリケーションではそうではありません。あなたがtext_fieldのため:user_idを使用して

+0

どのリクエストから 'params [:pin_number]'が得られますか? – Pavan

+0

また、残りのコードを表示できますか?この行 'if @user = User.find_by(pin_number:params [:pin_number])が間違っているbtw – Pavan

+0

私はそれが投稿であると信じるでしょう。 – Allen

答えて

1

議論を1として、フォームでは、あなたが

<%= form.label "Pin Number" %> 
<%= form.text_field :user_id, id: :pin, class: "form-control" %> 

を持っだからparams[:pin_number]を使用することは間違っています。 params[:inventory][:user_id]である必要があります。また、失敗したセーブも処理する必要があります。コードは以下のようになります。

def create 
    @user = User.find_by(pin: params[:inventory][:user_id]) 
    @inventory = Inventory.new(inventory_params) 
    @inventory.user_id = @user.id 
    if @inventory.valid? 
    @inventory.save 
    else 
    #write code to handle the failed save 
    end 
end 
+0

AH!だからもしピンが間違っていれば、それはinventory.user_id = user.idという点では失敗し、それはゼロであると言っています。部。他のif文の上にif文を使用する必要がありますか? – Allen

+0

@Allenはい、それを '@inventory.user_id = @ user.id if @ user'に変更してください – Pavan