我对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
我希望这个问题有道理。提前致谢!
答案 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