2016-01-21 2 views
0

Я хочу создать частичный вид моей регистрационной формы и добавить его в файл макета приложения, потому что он будет отображаться в панели навигации в выпадающем меню.Render simple_form из частичного представления на application.html.erb

Как создать эту форму на частичном изображении с помощью simple_form gem и сделать его на application.html.erb?

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

Учитывая, что приведенный выше код является способ создать форму, и я не знаю, где я должен определить @user для использования в макете приложения, ни, если я действительно в ней нуждается.

Может кто-то прояснить это?

ответ

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"); 
+0

Почему я не должен класть его в частичное?Я не использую динамические JS-файлы в моем проекте. Я уже использую шаблон, который я купил у ThemeForest, и имеет кучу JS-файлов, поэтому, если я начну добавлять динамические JS-файлы, это станет полным беспорядком IMHO. –

+0

Это не частичное, просто вы можете получить такую ​​же функциональность, ссылаясь на файл, который у вас уже есть –

+0

Извините, но я не понял «ссылку на файл, который у вас уже есть» –

0

Вы должны определить @user в соответствующем действии контроллера (я бы предположить из вашего кода, что контроллер называется учетной записью и действия регистра), это будет что-то вроде:

@user = User.new 

Для того, чтобы инициализировать экземпляр, который создается/обновляется. Затем атрибуты, используемые во всех полях, должны соответствовать таблице базы данных пользователей.

+0

Если я '@user = User.new' из' Account # Register' и сделать частичное, содержащее '<% = simple_form_for (@user, url: account_register_path) do | f | %> ', Я получаю:' undefined method 'model_name 'для nil: NilClass'. Поэтому мне пришлось изменить '@ user' на' User.new' на помощнике simple_form, чтобы он работал. Можно ли поступить иначе? –

+0

Это странно. При визуализации представления регистра вы передаете переменную @user? Поскольку render просто отображает представление с переменными, определенными в этот точный момент. Не могли бы вы показать мне, как вы оказываете в своем контроллере? –

+0

Я использую только 'render 'account/register_form''. Как инициализировать и передать переменную '@ user'? От каждого контроллера? –