创建方法不适用于推文 - 包含错误 "Couldn't find User without an ID"
create method is not working for a tweet - contains error "Couldn't find User without an ID"
我正在制作一个 Twitter 克隆并尝试制作它,以便用户的用户名出现在他们的推文旁边。
我通过在种子文件中添加一个用户和一条推文使其工作,但是当我添加一个创建、新方法和一个表单时,它会出现错误 "Couldn't find User without an ID" 并突出显示我的创建方法的第一行。不知道是什么问题,谢谢。
class TweetsController < ApplicationController
before_action :authenticate_user!, :except => [:index, :new, :create]
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
def edit
@tweet = Tweet.find(params[:id])
end
def update
@tweet = Tweet.find(params[:id])
@tweet.update(tweet_params)
redirect_to tweets_path
end
private
def tweet_params
params.require(:tweet).permit(:user_id,:content)
end
end
<h1>TWEETS</h1>
<%= simple_form_for [@user,@tweet], id: "form-submit" do |f| %>
<%= f.input :content, label: "Tweet" %>
<%= f.input :user %>
<%= f.button :submit, class: "btn btn-danger" %>
<% end %>
<br>
<% @tweets.each do |tweet| %>
<ul>
<li>
<%= tweet.created_at.strftime("%B %d %Y, %l:%M%P") %> <br>
<%= tweet.content %>
<%= tweet.user.username %>
</li>
</ul>
<% end %>
您需要在索引方法的变量中定义 @user
。
您在表单中使用的任何变量都需要在帮助程序、控制器或视图中的某处声明。 Rails 约定是在控制器中正常声明它们。
我需要查看您的 config/routes.rb
文件以了解您在图像中收到的错误消息,但如果您在命令行键入 rails routes
,您可以看到所有可用的列表路线,当你使用:
simple_form_for [@user, @tweet]
Rails会将[@user, @tweet]
解释为user_tweets_path
,并尝试将表单提交到该路径。该路径在您的 config/routes.rb
文件中定义。
错误告诉你你没有在路由文件中定义这个路径。要定义此路径,您可以将此行添加到您的路由文件中:
resources :users do
resources :tweets
end
class TweetsController < ApplicationController
before_action :authenticate_user!, :except => [:index, :new, :create]
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
def edit
@tweet = Tweet.find(params[:id])
end
def update
@tweet = Tweet.find(params[:id])
@tweet.update(tweet_params)
redirect_to tweets_path
end
private
def tweet_params
params.require(:tweet).permit(:user_id,:content)
end
end
<h1>TWEETS</h1>
<%= simple_form_for [@user,@tweet], id: "form-submit" do |f| %>
<%= f.input :content, label: "Tweet" %>
<%= f.input :user %>
<%= f.button :submit, class: "btn btn-danger" %>
<% end %>
<br>
<% @tweets.each do |tweet| %>
<ul>
<li>
<%= tweet.created_at.strftime("%B %d %Y, %l:%M%P") %> <br>
<%= tweet.content %>
<%= tweet.user.username %>
</li>
</ul>
<% end %>
您需要在索引方法的变量中定义 @user
。
您在表单中使用的任何变量都需要在帮助程序、控制器或视图中的某处声明。 Rails 约定是在控制器中正常声明它们。
我需要查看您的 config/routes.rb
文件以了解您在图像中收到的错误消息,但如果您在命令行键入 rails routes
,您可以看到所有可用的列表路线,当你使用:
simple_form_for [@user, @tweet]
Rails会将[@user, @tweet]
解释为user_tweets_path
,并尝试将表单提交到该路径。该路径在您的 config/routes.rb
文件中定义。
错误告诉你你没有在路由文件中定义这个路径。要定义此路径,您可以将此行添加到您的路由文件中:
resources :users do
resources :tweets
end