你好:)所以我想在我的演出页面实习中放一个新表格Review。
实习表
create_table "internships", force: :cascade do |t|
t.string "adress"
t.string "zipcode"
t.string "city"
t.string "specialty"
t.string "organization"
t.string "population"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.bigint "user_id"
t.text "description"
t.string "title"
t.string "cursus"
t.float "duration"
t.string "region"
t.integer "remuneration"
t.index ["user_id"], name: "index_internships_on_user_id"
end
查看表
create_table "reviews", force: :cascade do |t|
t.string "title"
t.float "notation"
t.text "description"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.bigint "review_user_id"
t.bigint "review_internship_id"
t.index ["review_internship_id"], name: "index_reviews_on_review_internship_id"
t.index ["review_user_id"], name: "index_reviews_on_review_user_id"
end
这两个模型链接在一起。如果您进行@ internship.reviews,则具有实习的所有评论;如果您进行@ review.review_internship,则具有该特定评论的实习。
我不知道如何更改我的新表单审阅,以便我可以在页面显示实习中进行新审阅。我在Internships#show中收到NameError,可以这样做吗?新评论仅与实习ID关联,因此,我认为最好是新的评论形式在展会页面实习中。我不知道是否有更好的方法可以做到这一点...
查看新表格
<%= form_with(model: review, local: true) do |form| %>
<div class="field">
<%= form.label :title %>
<%= form.text_field :title %>
</div>
<div class="field">
<%= form.label :notation %>
<%= form.number_field :notation %>
</div>
<div class="field">
<%= form.label :description %>
<%= form.text_area :description %>
</div>
<div class="field">
<%= form.label :review_internship %>
<%= form.number_field :review_internship %>
</div>
<div class="actions">
<%= form.submit %>
</div>
<% end %>
查看控制器
class ReviewsController < ApplicationController
before_action :set_review, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!
# GET /reviews/new
def new
@review = Review.new
end
# GET /reviews/1/edit
def edit
current_user_must_own_review
end
# POST /reviews
# POST /reviews.json
def create
@review = Review.new(review_params)
@review.review_user = current_user
respond_to do |format|
if @review.save
format.html { redirect_to @review, notice: 'Review was successfully created.' }
format.json { render :show, status: :created, location: @review }
else
format.html { render :new }
format.json { render json: @review.errors, status: :unprocessable_entity }
end
end
end
所以基本上我的问题是,实习控制器可以调用控制器Review的create方法吗?
我希望我的问题是可以理解的。谢谢。
欢迎使用堆栈溢出!
您想在实习生展示页面上获得一份新评论的表格。请记住,创建新记录通常需要在Rails中执行两项操作-new和create。 New
是通常具有表单的页面,create
是提交表单后的操作。
现在,如果您希望在实习生显示页面上使用该表单,则不再需要new
操作。您可以将表单本身移动到视图中以进行实习展示,如果您在此表单中使用任何实例变量,它们都将进入interships_controller#show
。
# controllers/internships_controller.rb
...
def show
...
@review = Review.new
end
# views/internships/show.html.erb
<%= form_with(model: @review, local: true) do |form| %>
...
现在,当您在表单上单击“提交”时,它仍将转到reviews_controller#create
。这是因为表单的第一行发生了一些“魔术”。在浏览器中加载页面,并在检查器中检查表单。看起来像这样(还有更多的属性)。
<form action="/reviews" method='post'>
[这意味着一旦您点击了提交,它将发出一个HTTP后请求,该请求将转到/reviews
。如果正确设置了路线,则可以在终端中使用rails routes
进行检查,然后将其转到reviews_controller
至create
操作。因此,您可以在其中处理创建新评论的逻辑。如果您是初学者,我建议您删除整个respond_to
块并改为执行此操作:
# controllers/reviews_controller.rb
def create
@review = Review.new(review_params)
@review.review_user = current_user
if @review.save
redirect_to @review, notice: 'Review was successfully created.' }
else
render :new
end
end
end
[这里您可以选择重定向回到实习显示页面。但是,您如何找出此评论仅针对哪个实习项目呢?您刚刚以一种很好的形式创建了一个字段-但对用户而言不是很直观。他/她在实习生显示页面上,现在必须填写此评论的实习生?接下来,您应该查看嵌套的资源,但是对于这个问题来说,这会有点过多。
另一个提示:您在评论表review_internship_id
中为实习指定了外键,这有点不寻常,您在致电@review.review_internship
时可以看到。只需internship
就可以了,然后您就可以进行@review.internships
-简短而简单。