我用旧版本的Rails和它附带的Turbolinks库构建了一个twitter克隆。我现在试图用新版本的Rails,版本7,并发现与它,我必须处理涡轮增压,而不是涡轮增压。我还没有任何成功的实施所需的修改,在我的项目,使推文显示在涡轮增压的方式。这是以前该功能的工作方式:tweets_controller.rb
创建了tweet并以turbo_stream格式发送数据
def create
@tweet = Tweet.new(tweet_params.merge(user: current_user))
if @tweet.save
respond_to do |format|
format.html { redirect_to dashboard_path }
format.turbo_stream
end
end
end
来自控制器的数据被发送到views/tweets/create.turbo_stream.erb
<%= turbo_stream.prepend "tweets" do %>
<%= render partial: "tweets/tweet", locals: { tweet_presenter: TweetPresenter.new(@tweet) } %>
<% end %>
...在发送到显示器之前,它被调度到presenters/tweet_presenter.rb
进行处理:
class TweetPresenter
include ActionView::Helpers::DateHelper
include Rails.application.routes.url_helpers
def initialize(tweet:, current_user:)
@tweet = tweet
@current_user = user
end
attr_reader :tweet, :current_user
delegate :user, :body, :likes, :likes_count, :retweets_count, to: :tweet
delegate :username, :display_name, :avatar, to: :user
...最后,tweet被发送到tweets/tweet.html.erb
显示,并被 Package 在以下标签中:
<%= turbo_frame_tag dom_id(tweet_presenter.tweet) do %>
这是不工作,现在与涡轮增压.我得到以下错误消息在控制台:
Started POST "/tweets" for ::1 at 2023-04-13 14:29:24 -0700
Processing by TweetsController#create as TURBO_STREAM
Parameters: {"authenticity_token"=>"[FILTERED]", "tweet"=>{"body"=>"GSd"}, "commit"=>"Tweet"}
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 1], ["LIMIT", 1]]
↳ app/controllers/application_controller.rb:2:in `block in <class:ApplicationController>'
TRANSACTION (0.1ms) BEGIN
↳ app/controllers/tweets_controller.rb:11:in `create'
Tweet Create (0.5ms) INSERT INTO "tweets" ("user_id", "body", "created_at", "updated_at", "likes_count", "retweets_count") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id" [["user_id", 1], ["body", "GSd"], ["created_at", "2023-04-13 21:29:24.980899"], ["updated_at", "2023-04-13 21:29:24.980899"], ["likes_count", 0], ["retweets_count", 0]]
↳ app/controllers/tweets_controller.rb:11:in `create'
TRANSACTION (0.6ms) COMMIT
↳ app/controllers/tweets_controller.rb:11:in `create'
Rendering tweets/create.turbo_stream.erb
Rendered tweets/create.turbo_stream.erb (Duration: 27.5ms | Allocations: 1184)
Completed 500 Internal Server Error in 40ms (ActiveRecord: 1.5ms | Allocations: 5382)
ActionView::Template::Error (wrong number of arguments (given 1, expected 0; required keywords: tweet, current_user)):
1: <%= turbo_stream.prepend "tweets" do %>
2: <%= render partial: "tweets/tweet", locals: { tweet_presenter: TweetPresenter.new(@tweet) } %>
3: <% end %>
app/presenters/tweet_presenter.rb:5:in `initialize'
app/views/tweets/create.turbo_stream.erb:2:in `new'
app/views/tweets/create.turbo_stream.erb:2
app/views/tweets/create.turbo_stream.erb:1
有什么办法可以补救吗?
非常感谢!
1条答案
按热度按时间twh00eeo1#
这看起来像是一个参数传递问题。
您的TweetPresenter需要2个keyword参数,并且都是必需的:
但是您初始化演示者时没有使用关键字arg:
这就是为什么你会看到错误:
ActionView::Template::Error (wrong number of arguments (given 1, expected 0; required keywords: tweet, current_user)):
(注意该消息中的“required keywords”。)。这反过来会导致周围视图失败。尝试将该部分更改为如下内容:
另外,我认为您的TweetPresenter中可能存在次要错误。
第3行尝试将
user
赋值给示例变量@current_user
,但此方法不接受user
,而是接受current_user
关键字参数。它应该是:@current_user = current_user