为不同的控制器创建表单

时间:2013-04-03 20:30:57

标签: ruby-on-rails

我有几本用户可以创建的书籍,然后为他们创建页面。

routes.rb中:

resources :books do
  member do
    get 'pages'
  end
end

这提供了通过/ books /:book_id / pages

创建新页面的链接

在该页面中,我渲染了一个部分:

<%= render '/pages/new' %>

书籍管理员:

def page
    @book = Book.find(params[:id])
    @page = @book.pages.new
end

但是当params传递给页面控制器时,book_id将丢失:

页面控制器:

def create
  @page = Page.new(params[:page])
   if @page.save          
     redirect_to @page
   else
     render 'new'
   end
end

错误处理也变得困难,因为重定向后id也会消失。

我相信应用程序的其余部分似乎很好,因为当我通过控制台创建页面时,book_id被保留。

这是我的第一个应用程序,所以我甚至不确定这是否是接近它的正确方法......我怎样才能让它工作?

谢谢你们!

2 个答案:

答案 0 :(得分:0)

调试此方法的一种方法是在控制器中使用“puts”来查看params以查看实际存在的内容。 “puts”就像java中的println或PHP中的echo一样

使用此代码运行时,请发布params的内容

def create
  puts "params = #{params}"
  @page = Page.new(params[:page])
   if @page.save          
     redirect_to @page
   else
     render 'new'
   end
end

答案 1 :(得分:0)

可以通过这种方式处理嵌套资源。

# config/routes.rb
resources :books do
  resources :pages
end

您还可以在资源调用中使用only: [:index, :new]except: [:destroy]来限制正在创建的操作。

PagesController中,您可以使用以下参数。

GET /books/:book_id/pages/:id => creates a params[:book_id] and params[:id]

# app/controllers/pages_controller.rb
def create
  @book = Book.find(params[:book_id])

  @page = @book.pages.build(params[:page])

  if @page.save
    # ...
  else
    # ..
  end
end

请注意,通过关联构建新对象的方法调用是@book.pages.build而不是.new。您将了解有关Rails关联以及如何通过the Rails Guides on ActiveRecord associations中的关联构建和创建对象的所有信息。希望这些指针有所帮助。

如果你想调试传入的参数,你可以按照上面建议的C404来提升它们。

# in any controller
def any_method
  raise params.inspect
  # or in yaml format
  raise params.to_yaml
end