Ruby on rails 在application.html.erb上从局部视图呈现简单表单

Ruby on rails 在application.html.erb上从局部视图呈现简单表单,ruby-on-rails,simple-form,Ruby On Rails,Simple Form,我想为我的注册表创建一个局部视图,并将其添加到应用程序布局文件中,因为它将显示在下拉菜单的导航栏中 如何使用simple\u form gem在局部视图中创建此表单,并在application.html.erb上进行渲染 <%= simple_form_for(@user, url: account_register_path) do |f| %> 考虑到上面的代码是创建表单的方法,我不知道应该在哪里定义应用程序布局中使用的@user,也不知道我是否真的需要它 有人能澄清一下吗

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

如何使用
simple\u form gem
在局部视图中创建此表单,并在
application.html.erb
上进行渲染

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

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


有人能澄清一下吗?

您必须在相应的控制器操作中定义@user(我可以从您的代码中假设,控制器称为account,操作称为register),它类似于:

@user = User.new

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

不要将其放在部分中,只需拥有自己的
注册
视图,用
渲染
调用即可

#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| %>
...
这将允许您使用:

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

如果我从
Account#Register
中执行
@user=user.new
,并呈现包含
的部分,我会得到:nil:NilClass
未定义方法
模型名称。因此,我必须将
@user`更改为user.new在simple\u form helper上,以使其正常工作。有没有可能用另一种方式做呢?真奇怪。呈现寄存器视图时,是否传递@user变量?因为render只会显示那个时刻定义了变量的视图。你能告诉我你是如何在你的控制器中渲染的吗?我只使用了
render'account/register\u form'
。如何初始化和传递
@user
变量?从每个控制器?为什么我不把它放在一个部分?我的项目中没有使用动态JS文件。我已经在使用一个我以前从他们那里买的模板,它有一堆JS文件,所以如果我也开始添加动态JS文件,它会变得一团糟。这不是部分,只是你可以通过引用你已经拥有的文件来获得相同的功能对不起,但我不理解“引用你已经拥有的文件”如果您有一个
accounts/new.html.erb
文件,为什么不直接引用它而不是创建一个全新的分部文件呢?但是在这种情况下,我需要禁用此操作的布局。
#app/views/accounts/new.html.erb
<%= simple_form_for @user, url: account_register_path do |f| %>
#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");