ошибка «Не удалось найти пользователя без идентификатора» при попытке создать твит - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь сделать твиттер-клон, в котором в твите отображается имя пользователя рядом с ним.однако, получая вышеупомянутое сообщение об ошибке и выделяя первую строку моего метода создания.любые идеи о том, как решить.Я уже сделал ассоциацию.спасибо

class TweetsController < ApplicationController

  def index
    @tweets = Tweet.all.order("created_at DESC")
    @tweet = Tweet.new
  end

  def show
    @tweet = Tweet.find(params[:id])
  end

  def new
    # @tweet = Tweet.new
  end

  def create
    @user = User.find(params[:id])
    @tweet = Tweet.new(tweet_params)
    @tweet.user = @user
    if @tweet.save
      redirect_to tweets_path
    end
  end

  private

  def tweet_params
    params.require(:tweet).permit(:content, :user_id)
  end

end

твиты

<%= simple_form_for @tweet, id: "form-submit" do |f| %>
   <%= f.input :content %>
   <%= f.button :submit, class: "btn btn-danger" %>
<% end %>

<% @tweets.each do |tweet| %>
  <ul>
    <li>
      <%= tweet.content %>
      <%= tweet.user.username %>
    </li>
  </ul>
<% end %>

Ответы [ 4 ]

0 голосов
/ 02 января 2019

В соответствии с принятым здесь ответом, наиболее подходящим изменением может быть:

  def new
    @tweet = current_user.tweets.new
  end

  def create
    @tweet = Tweet.new(tweet_params)
    if @tweet.save
      redirect_to tweets_path
    end
  end

Больше ничего не нужно было делать.

0 голосов
/ 29 сентября 2018

params хеш не содержит id, из-за чего вы получаете эту ошибку.

Просто измените ваше действие создания как

  def create
    @user = current_user
    @tweet = Tweet.new(tweet_params)
    @tweet.user = current_user
    if @tweet.save
      redirect_to tweets_path
    end
  end

Или

вместо вышеуказанного вы также можете передать user_id из формы.

<%= simple_form_for @tweet, id: "form-submit" do |f| %>
   <%= f.input :content %>
   <%= f.hidden_field :user_id, value: current_user.try(:id) %>
   <%= f.button :submit, class: "btn btn-danger" %>
<% end %>

, а затем изменить действие создания как

  def create
    @tweet = Tweet.new(tweet_params)
    if @tweet.save
      redirect_to tweets_path
    end
  end

ПРИМЕЧАНИЕ. Предполагается, что вы используете devise gem для аутентификации.

0 голосов
/ 01 октября 2018

Вы определяете tweet.users после использования tweet_params, поскольку для tweet_params пользователь не определен, поэтому вы получаете эту ошибку.

0 голосов
/ 29 сентября 2018

Ваша форма не имеет поля id, поэтому params[:id] равно nil.

...