gpt4 book ai didi

ruby-on-rails - 为表单初始化新对象

转载 作者:行者123 更新时间:2023-12-04 06:08:15 25 4
gpt4 key购买 nike

我刚学rails,希望有人能指导我解决一个理论问题。

我正在处理的类(class)作业要求我为一个部分初始化一个新的评论对象,其中包括一个用于提交新评论的表单。如果用户未登录到应用程序,则不会呈现表单。

据我所知,我们鼓励您在 Controller 中保留尽可能多的代码,因此我认为这是初始化 @comment = @post.comments.new 的最佳位置。

来自 posts_controller.rb 的片段:

  def show
@topic = Topic.find(params[:topic_id])
@post = Post.find(params[:id])
@comment = @post.comments.new
authorize @comment
@comments = @post.comments.all
end

这是部分评论/_form.html.erb:

<h3>Add a comment:</h3>
<%= form_for [topic, post, comment], html: {class: "form-inline"} do |f| %>
<%= f.label "Body" %>
<%= text_field(:comment, :body) %>
<%= f.submit "Create Comment" %>
<% end %>

下面是调用部分 post/show.html.erb 的表单:

<h1><%= markdown_to_html @post.title %></h1>
<div>
<%= image_tag(@post.image.small.url) if @post.image? %>
</div>
<div class="row">
<div class="col-md-8">
<small>
<%= image_tag(@post.user.avatar.tiny.url) if @post.user.avatar? %>
submitted <%= time_ago_in_words(@post.created_at) %> ago by
<%= @post.user.name %>
</small>
<p><%= markdown_to_html @post.body %></p>
</div>
<div class="col-md-4">
<% if policy(@post).edit? %>
<%= link_to "Edit", edit_topic_post_path(@topic, @post), class: 'btn btn-success' %>
<% end %>
</div>
</div>
<div class="row">
<div class="col-md-1">
<h1>Comments</h1>
</div>
</div>
<%= render partial: "comments/comments", collection: @comments, as: :comment %>
<% if policy(Comment.new).create? %>
<div class="row">
<div class="col-md-12">
<%= render partial: "comments/form", locals: { topic: @topic, post: @post, comment: @comment } %>
</div>
</div>
<% end %>

问题是如果用户没有登录到应用程序,@comment 的授权在 Controller 中失败,并阻止 posts/show.html.erb 呈现。

也许我可以在 posts/show.html.erb 中做这样的事情?:

   <% if policy(Comment.new).create? %>
<% @comment = Comment.new %>
<div class="row">
<div class="col-md-12">
<%= render partial: "comments/form", locals: { topic: @topic, post: @post, comment: @comment } %>
</div>
</div>
<% end %>

这是合法的,还是技术不好?

任何能为我指明正确道德方向的建议都将不胜感激!

最佳答案

我认为主要问题出在 Controller 中的 authorize @comment 行。这条线首先给你带来了问题,所以让我们考虑改变它。

因为这是帖子 Controller ,所以你应该在那里授权一个帖子对象,而不是评论对象。这样您就可以将 @comment 的创建留在 Controller 中。无论如何,它更符合 Rails 惯例。

在 View 中使用 if policy(Comment.new).create? 是正确的,尽管通过此更改您现在也可以执行 if policy(@comment).create?.

关于ruby-on-rails - 为表单初始化新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30723521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com