具有其他控制器中新方法的轨道形式

问题描述 投票:0回答:1

你好:)所以我想在我的演出页面实习中放一个新表格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方法吗?

我希望我的问题是可以理解的。谢谢。

ruby-on-rails-5
1个回答
0
投票

欢迎使用堆栈溢出!

您想在实习生展示页面上获得一份新评论的表格。请记住,创建新记录通常需要在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_controllercreate操作。因此,您可以在其中处理创建新评论的逻辑。如果您是初学者,我建议您删除整个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-简短而简单。

© www.soinside.com 2019 - 2024. All rights reserved.