Ruby on rails RubyonRails表单_用于创建空对象

Ruby on rails RubyonRails表单_用于创建空对象,ruby-on-rails,ruby-on-rails-4,form-for,Ruby On Rails,Ruby On Rails 4,Form For,我的警报/视图/文件夹中有一个名为_form.html.erb的部分文件。我从我的代理/视图/文件夹中的“显示”页面呈现该部分 所有内容都正确渲染,并且分部确实会创建新警报,但警报完全为空 警报\u控制器创建方法 def create @alert = Alert.new(body: params[:body], severity: params[:severity], agency_id: @current_mem

我的警报/视图/文件夹中有一个名为_form.html.erb的部分文件。我从我的代理/视图/文件夹中的“显示”页面呈现该部分

所有内容都正确渲染,并且分部确实会创建新警报,但警报完全为空

警报\u控制器创建方法

def create
  @alert = Alert.new(body: params[:body],
                   severity: params[:severity],
                   agency_id: @current_member.id)

    respond_to do |format|
      if @alert.save
        format.html { redirect_to @alert.agency, notice: 'Alert was successfully created.' }
        format.json { render :show, status: :created, location: @alert}
      else
        format.html { render :new }
        format.json { render json: @alert.errors, status: :unprocessable_entity }
      end
    end
  end
\u form.html.erb

<%= form_for(Alert.new) do |f| %>
  <div class="input-group">
    <div class="field">
      <%= f.label :body %><br>
      <%= f.text_field :body %>
    </div>
    <div class="field">
      <%= f.label :severity %><br>
      <%= f.number_field :severity %>
    </div>
    <div class="action">
      <%= f.submit %>
    </div>
  </div>
<% end %>
在代理控制器中显示方法

但同样的事情也会发生。我做错了什么

编辑

这是在我点击submit时开始的日志,在alerts.create方法中加载重定向之前结束的日志

Started POST "/alerts" for ::1 at 2016-03-31 18:29:43 -0400
Processing by AlertsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"CgpepnYUec9uUoE/Ys6SAkOlzmK+w2q9IN782sXNoXnB3UyuegiS6m+W+mW+nXu4EIL8P8xH6JdigU8FfmzhVw==", "alert"=>{"body"=>"This is the body text", "severity"=>"12345"}, "commit"=>"Create Alert"}
  Account Load (0.1ms)  SELECT  "accounts".* FROM "accounts" WHERE "accounts"."id" = ? LIMIT 1  [["id", 7]]
  Agency Load (0.1ms)  SELECT  "agencies".* FROM "agencies" WHERE "agencies"."id" = ? LIMIT 1  [["id", 2]]
   (0.1ms)  begin transaction
  SQL (0.2ms)  INSERT INTO "alerts" ("agency_id", "created_at", "updated_at") VALUES (?, ?, ?)  [["agency_id", 2], ["created_at", "2016-03-31 22:29:43.014846"], ["updated_at", "2016-03-31 22:29:43.014846"]]
   (135.8ms)  commit transaction
  Agency Load (0.1ms)  SELECT  "agencies".* FROM "agencies" WHERE "agencies"."id" = ? LIMIT 1  [["id", 2]]
Redirected to http://localhost:3000/agencies/2
Completed 302 Found in 141ms (ActiveRecord: 136.2ms)
当我注释掉alerts.create方法并添加此行时:

@alert = Alert.new
render plain: params
这是输出:

{"utf8"=>"✓", 
"authenticity_token"=>"3OfteFX41SV/5NxpTcKbP7AKhLm/ZKah+NXVn84e2xwXMP9wWeQ+AH4gpzORkXKF4y225M3gJIu6imZAdb+bMg==", 
"alert"=>{"body"=>"This is the body text.", "severity"=>"12345"},
"commit"=>"Create Alert", "controller"=>"alerts", "action"=>"create"}

根本原因可以从
params
调试中看出。
params
散列中有一个
alert
键。
警报
值是
正文
严重性
的散列

在控制器中,可以引用
params[:body]
params[:severity]
。这些应该是
params[:alert][:body]
params[:alert][:severity]

有没有理由不使用Rails的强参数?您可以重构为如下内容:

def create
  @alert = Alert.new(alert_params.merge(agency_id: @current_member.id)
  …
end
…

private

  def alert_params
    params.require(:alert).permit(:body, :severity)
  end

创建方法中
参数应该是这样的

因为您的参数
“alert”=>{“body”=>“这是正文。”,“severity”=>“12345”}


你能分享
控制台
日志吗?试试这个:
@alert=alert.new({body:params[:body],severity:params[:severity],agency\u id:@current\u member.id})
你也可以尝试在create方法中注释所有内容并添加这个,然后触发它
render plain params
查看数据的传递方式。
def create render plain:params end
您可以看到发送参数以创建方法。输入的参数可以很好地解释它,不是吗?您正在访问
params[:body]
,但body位于
params[:alert][:body]
下。不过,不清楚你为什么要从机构控制员那里发出警报。另外,使用类似于
pry
的工具可以让您直接检查控制器中的参数。@MatthewCliatt Check post如下,应该可以!非常感谢你的工作!但是现在我很困惑,因为我们有另一个表单,它是用于发布的,并且直接访问params[:body],params[:title],等等。为什么我的代码传递带有这些信息的警报,而不是params中的信息?还有,有人曾经说过,使用form_for(alert.new)不如使用form_for(@alert)好。有什么区别?我应该单方摇摆吗?关于你的第一条评论,我想Posts表单没有在Post对象上使用
form_表示
。它可能只是在使用
form_标记
并试图管理参数本身。您使用模型对象和
表单_的代码是更惯用的Rails。在我看来,您的代理控制器应该专注于列出、显示和创建代理模型。是的,让AlertsController重定向到代理机构感觉有点“不舒服”→在成功创建新警报后显示,但我发现这是现实世界中最不糟糕的选择。大多数客户端都希望包含UI的页面能够操作多个模型。除非您想使用单页应用程序并将Rails用作JSON API端点,否则我还没有找到比这更好的方法。(见附件)
{"utf8"=>"✓", 
"authenticity_token"=>"3OfteFX41SV/5NxpTcKbP7AKhLm/ZKah+NXVn84e2xwXMP9wWeQ+AH4gpzORkXKF4y225M3gJIu6imZAdb+bMg==", 
"alert"=>{"body"=>"This is the body text.", "severity"=>"12345"},
"commit"=>"Create Alert", "controller"=>"alerts", "action"=>"create"}
def create
  @alert = Alert.new(alert_params.merge(agency_id: @current_member.id)
  …
end
…

private

  def alert_params
    params.require(:alert).permit(:body, :severity)
  end
def create
  @alert = Alert.new(body: params[:alert][:body],
                   severity: params[:alert][:severity],
                   agency_id: @current_member.id)

    respond_to do |format|
      if @alert.save
        format.html { redirect_to @alert.agency, notice: 'Alert was successfully created.' }
        format.json { render :show, status: :created, location: @alert}
      else
        format.html { render :new }
        format.json { render json: @alert.errors, status: :unprocessable_entity }
      end
    end
  end