尝试创建推文时出错 "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
没有其他事情需要做。
我正在尝试制作一个 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
没有其他事情需要做。