在application.html.erb

时间:2016-01-21 00:37:49

标签: ruby-on-rails simple-form

我想为我的注册表单创建一个局部视图,并将其添加到应用程序布局文件中,因为它将显示在下拉菜单的导航栏中。

如何使用simple_form gem在部分视图中创建此表单并在application.html.erb上呈现?

<%= simple_form_for(@user, url: account_register_path) do |f| %>

考虑到上面的代码是创建表单的方式,我不知道应该在应用程序布局中定义@user的位置,也不知道我是否真的需要它。

有人可以澄清一下吗?

2 个答案:

答案 0 :(得分:0)

您必须在相应的控制器操作中定义@user(我假设您的代码中,该控制器称为帐户,操作是注册),它将类似于:

@user = User.new

为了初始化正在创建/更新的实例。然后,所有字段中使用的属性应与用户数据库表匹配。

答案 1 :(得分:0)

请勿将其置于部分内容,只需拥有registration视图,并使用render调用...

#app/views/layouts/application.html.erb
<%= render "accounts/new" %>

#app/views/accounts/new.html.erb
<%= simple_form_for :user, url: account_register_path do |f| %>
...

虽然you can use a symbol to populate form_for,但它不会包含模型的属性,或者提供上下文的各种隐藏方法(例如id等)。

如果您想使用变量填充accounts#new视图/操作,则必须在ApplicationController中设置它:

#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
   before_action :set_user

   private

   def set_user
      @user = User.new
   end
end

这将允许您使用:

#app/views/accounts/new.html.erb
<%= simple_form_for @user, url: account_register_path do |f| %>

-

实现这一点的最佳方法是使用Ajax - 这样,@user对象仅在您需要时创建(解决膨胀)。

我们done this before

enter image description here

您只需要以下内容:

#app/views/layouts/application.html.erb
<%= link_to "New User", account_register_path, remote: true %>

#app/controllers/accounts_controller.rb
class AccountsController < ApplicationController
   respond_to :js, :html

   def new
      @user = User.new
      respond_with @user
   end 
end

#app/views/accounts/new.js.erb
$("<%=j render 'accounts/new' %>").appendTo("body");