ActiveRecord :: AssociationTypeMismatch в PortfoliosController # create - PullRequest
0 голосов
/ 07 мая 2018

Я борюсь с этой ошибкой, вот мой код контроллера

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

      # GET /portfolios
      # GET /portfolios.json
      def index
        @portfolios = Portfolio.all
      end

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

Я действительно новичок в кодировании, и я не уверен, какой код критичен для этой ошибки, а какой нет, поэтому я разместил весь код на странице контроллеров

      # GET /portfolios/new
      def new
        @portfolio = Portfolio.new
      end

      # GET /portfolios/1/edit
      def edit
      end

      # POST /portfolios
      # POST /portfolios.json
      def create
        # init_params = portfolio_params
        # init_params[:user] = current_user.id
        puts params
        @portfolio = Portfolio.new(portfolio_params(params[:portfolio]))

        respond_to do |format|
          if @portfolio.save
            format.html { redirect_to @portfolio, notice: 'Portfolio was successfully created.' }
            format.json { render :show, status: :created, location: @portfolio }
          else
            format.html { render :new }
            format.json { render json: @portfolio.errors, status: :unprocessable_entity }
          end
        end
      end

Я просто размещаю этот комментарий здесь, чтобы разбить код, чтобы я мог опубликовать

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

      # DELETE /portfolios/1
      # DELETE /portfolios/1.json
      def destroy
        @portfolio.destroy
        respond_to do |format|
          format.html { redirect_to portfolios_url, notice: 'Portfolio was successfully destroyed.' }
          format.json { head :no_content }
        end
      end

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

Я немного поиграл с этим последним разделом, изменив: user на: user.id, но это не помогло, я также изменил: design на: design_name

        def portfolio_params(params)
          # params = params[:portfolio]
          params.permit(:design_name, :user)

          # user.id was changed back to user
        end
    end

Эй, прости! Полный код ошибки:

   Extracted source (around line #31):
29
30
31
32
33
34

    # init_params[:user] = current_user.id
    puts params
    @portfolio = Portfolio.new(portfolio_params(params[:portfolio]))

    respond_to do |format|
      if @portfolio.save

1 Ответ

0 голосов
/ 08 мая 2018

Вы звоните portfolio_params двумя разными способами. В update вы не передаете параметры; в create вы передаете параметры. Обычный способ - не передавать какой-либо параметр.

Более того, вы разрешаете параметр user, но, похоже, вы используете current_user, поэтому user не требуется.

def portfolio_params
  params.require(:portfolio).permit(:design_name)
end

И называть это всегда без чего-либо:

@portfolio = current_user.portfolios.new(portfolio_params)
#I'm assuming a user has_many portfolios and a portfolio belongs_to user and has a user_id field in the database.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...