尝试创建推文时出错 "Couldn't find User without an ID"

error "Couldn't find User without an ID" when trying to create a tweet

我正在尝试制作一个 Twitter 克隆,其中一条推文会在其旁边显示用户的用户名。但是收到上述错误消息并突出显示我的创建方法的第一行。关于如何解决的任何想法。 我已经完成了关联。 谢谢

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 %>

您的表单没有 id 字段,因此 params[:id]nil

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

注意:假设您正在使用设计 gem 进行身份验证

您在使用 tweet_params 后定义 tweet.users,因为 tweet_params 用户未定义,这就是您收到此错误的原因。

根据此处接受的答案,最合适的更改可能是:

  def new
    @tweet = current_user.tweets.new
  end

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

没有其他事情需要做。