我想为我的注册表单创建一个局部视图,并将其添加到应用程序布局文件中,因为它将显示在下拉菜单的导航栏中。
如何使用simple_form gem
在部分视图中创建此表单并在application.html.erb
上呈现?
<%= simple_form_for(@user, url: account_register_path) do |f| %>
考虑到上面的代码是创建表单的方式,我不知道应该在应用程序布局中定义@user
的位置,也不知道我是否真的需要它。
有人可以澄清一下吗?
答案 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
对象仅在您需要时创建(解决膨胀)。
您只需要以下内容:
#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");