【问题标题】:Routing a form/create object post request in rails--problems with the form and routing request在 Rails 中路由表单/创建对象发布请求——表单和路由请求的问题
【发布时间】:2014-05-12 02:03:28
【问题描述】:

我对 Rails 很陌生,如果措辞不佳,我很抱歉……对于一门课程,我正在创建一个应用程序,让您可以添加(发布)名为 Planets 和 Moons 的类的新实例。 Moon应该是Planet的孩子。现在我可以使用三个路由请求在单独的数据库表中创建两者:

get "planets" => "planets#index"
get "planets/new" => "planets#new"
post "/planets" => "planets#create"

(这将创建一个表单页面来注册新的行星。替换“moons”,moon 类的工作方式相同,包括从它自己的表单页面创建。)

我有第四条路线用于行星显示页面

get "planets/:id" => "planets#show"

在这个行星 id 显示页面上,我想创建一个“添加月球”表单,该表单采用行星的参数 ID,让用户输入月球名称,并发送发布请求以创建新实例。

我认为我对表单和路由的了解不够。

我的新月形式是

<%= form_for @moon, url: "/planets/:id" do |f| %>
  <p><strong>New Moon Name:</strong></p>
  <p>Name: <%= f.text_field :name %></p>
  <% Planet.find(params[:id]: :planet_id %>
  <p><%= f.submit "Create!" %></p>
<% end %>

我拥有的三个“月球”路线: 1)得到“月亮”=>“月亮#index” 2)获取“moons/new”=>“moons#new”(转到我用来测试的表格,我不知道我是否需要这个) 3)发布“/planets/:id”=>“moons#create”(我认为问题出在哪里)

我想我可能需要使用插值将行星 ID 从参数中获取到月球发布表格中,所以帮助很大,但我更关心的是越过这条线:

 <%= form_for @moon, url: "/planets/:id" do |f| %>

我收到错误:“表单中的第一个参数不能包含 nil 或为空”

这是我在卫星控制器中定义的...

def new
  @moon = Moon.new
end

def create
  moon_attributes = params[:moon]

  Moon.create({
    name: moon_attributes[:name],
    planet_id: moon_attributes[:planet_id]
  })
end

我希望这个问题有意义。提前致谢!

【问题讨论】:

  • 修复了 8 小时内我无法回答自己的问题...似乎用直接调用新实例替换表单标记中的 url 会将新实例保存到数据库中..

    月球名称:

    "#{planet.id}".to_i %>

    路由是 get "moons" => "moons#index" get "moons/new" => "moons#new" post "/moons" => "moons#create"

标签: ruby-on-rails forms


【解决方案1】:

为了给你一些观点,这是你需要做的:

#config/routes.rb
resources :planets, only: [:index, :new, :create, :show] do
   resources :moons, only: [:create] #-> planets/:id/moons
end

这使用 Rails 中的resourceful routing 结构,为您提供无论如何您已经拥有的路径。


就你的形式而言,你最好这样做:

#app/views/planets/show.html.erb
<%= form_for @moon do |f| #-> should route to  moons_controller#create %>
  <p><strong>New Moon Name:</strong></p>
  <p>Name: <%= f.text_field :name %></p>
  <p><%= f.submit "Create!" %></p>
<% end %>

#app/controllers/moons_controller.rb
class MoonsController < ActiveRecord::Base
    def create
       moon = Moon.new(moon_params)
       moon.save
       redirect_to planets_show_path(planet)
    end

    private
    def moon_params
       params.require(:moon).permit(:name).merge(planet_id: params[:planet_id])
    end

end

【讨论】:

    猜你喜欢
    • 2019-10-29
    • 2015-12-30
    • 2015-11-24
    • 1970-01-01
    • 2021-07-20
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多