在rails中路由表单/创建对象发布请求 - 表单和路由请求的问题

时间:2014-05-12 02:03:28

标签: ruby-on-rails forms

我对rails非常陌生,所以如果措辞不好,那就很抱歉...对于一门课程,我正在创建一个应用程序,允许你添加(发布)名为Planets and Moons的新类实例。月亮应该是星球的孩子。现在,我可以使用三个路径请求在单独的数据库表中创建它们:

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

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

我有第四条路线用于行星show-by-id页面

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

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

我认为我对形式和路由知之甚少。

我的新月形式是

<%= 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)得到“moons”=&gt; “月亮#指数”      2)得到“moons / new”=&gt; “卫星#new”(转到我用来测试的形式,我不知道我是否需要这个)      3)发布“/ planets /:id”=&gt; “卫星#create”(我觉得问题在哪里)

我想我可能需要使用插值来将行星ID从params变成月亮发布表格,所以帮助很好,但我更关心的是越过这条线:

 <%= 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

我希望这个问题有道理。提前致谢!

1 个答案:

答案 0 :(得分:0)

为了给你一些观点,以下是你需要做的事情:

#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