2010-10-09 1 views
2

Надеюсь, я могу быть в курсе моей проблемы. Если вам нужно уточнить, что я имею в виду, сообщите мне, и я попытаюсь прояснить все, что смогу.Добавление эффектов Javascript к форме в RoR

В настоящее время я работаю над простым проектом Ruby on Rails, и я хочу добавить интерактивность в свою форму входа. В настоящее время форма входа в систему работает нормально, если вы нажмете ссылку «Вход», которая приведет вас к странице new_user_sessions. Но я хочу вырезать перенаправление, и когда пользователь нажимает кнопку «Вход», форма входа будет показана примерно за 700 миллисекунд на той же странице. Я просто хочу использовать функцию show(700), чтобы открыть форму входа. Проблема, с которой я столкнулась, я полагал, что могу поместить эту форму входа в каталог макетов, чтобы у пользователя была возможность войти в систему со всех страниц. Дело в том, что моя форма входа зависит от объекта @user_session от контроллера User_sessions (с использованием authlogic). Вот что содержит мой new.html.erb файл для контроллера User_sessions:

<%= form_for @user_session do |f| %> 
<%= render '/shared/error_messages', :target => @user_session %> 

<p> 
    <%= f.label :username %><br /> 
    <%= f.text_field :username %><br /> 
</p> 
<p> 
    <%= f.label :password %><br /> 
    <%= f.password_field :password %><br /> 
</p> 
<p class="button"> 
    <%= f.submit "Submit" %> 
</p> 
<% end %>` 

Когда пользователь нажимает на ссылку Войти Я хотел бы эту форму было показано с помощью функции show(). Есть ли способ, которым я могу это сделать? Может быть, имея какой-то оператор render в application.html.erb, который отображает это новое представление User_sessions? Спасибо за любую помощь.

+0

Я бы также рекомендовал поместить логин в общий каталог, а не в каталог макетов.Наверное, это не имеет большого значения, но его лучшая практика. – Lukas

+0

Вы используете jquery или только стандартные js? какая версия рельсов? – Lukas

+0

Я использую jquery и rails 3. – Fizz

ответ

0

Поместите форму входа в частично:

приложение/просмотров/user_sessions/_login.erb

<%= form_for user_session do |f| %> 
<%= render '/shared/error_messages', :target => user_session %> 

<p> 
    <%= f.label :username %><br /> 
    <%= f.text_field :username %><br /> 
</p> 
<p> 
    <%= f.label :password %><br /> 
    <%= f.password_field :password %><br /> 
</p> 
<p class="button"> 
    <%= f.submit "Submit" %> 
</p> 
<% end %> 

Рендер парциальное из макета:

приложение/просмотров/layout/application.html.erb

<% if @user_session %> 
    <%= render "user_sessions/login", :user_session => @user_session %> 
<% end %> 

И, наконец, убедитесь, что вы установили @user_session на пустой объект UserSession, где это необходимо:

приложение/контроллеры/application_controller.rb

before_filter :set_user_session 
protected 
    def set_user_session 
    # do some logic here to set @user_session when appropriate. 
    end 
+0

макет имеет доступ к @user_session? Значение выражения if вернет true? – Fizz

+0

макет имеет доступ ко всему, что делает обычный вид. он просто обертывает все ваши взгляды. – Lukas

+0

Ну, хорошая новость заключается в том, что она не падает и не дает мне некоторую ошибку. Плохая новость заключается в том, что когда я нажимаю «Вход», анимация не воспроизводится. Я попробовал это только с текстом, и анимация работает отлично, поэтому его не jQuery. Я считаю, что частичное не получается. Чтобы это сработало, необходимо, чтобы частичное было в каталоге views/user_sessions, потому что у меня оно есть под view/shared /. – Fizz

0

По мнению, используйте выше предложение, путем создания Войти частичными и иметь его сделать в чем-то вроде

<div id="login_div" style="display:none"> 
    <%= render :partial => "login" %> 
</div> 

для ссылки для входа (тот, который должен показать логин, вам можно просто добавить :remote => true собственность, а затем в вашей авторизации действия (тот, который отображает форму входа),

respond_to do |wants| 
    wants.html { redirect_to :login } 
    wants.js { render :action => "login.js.erb" } 
end 

И тогда в вашем login.js.erb вы можете сделать

$("#login_div").show(700) 

Таким образом, вы также можете поддерживать тех, у кого JS отключен. Кроме того, вы могли бы сделать все это исключительно в application.js файле (при использовании JQuery):

$('#login_link').click(function(e) { 
    e.preventDefault() 
    $("#login_div").show(700) 
} 

Это намного более ненавязчивым решение.

+0

Я попробую это. – Fizz

+0

Теперь login.js.erb - это представление, чтобы оно не попадало в папку public/javascript, но в каталоге views/user_sessions/правильно? – Fizz

+0

Если я использую ваш оператор рендеринга, как я получаю следующую ошибку, когда он пытается отобразить частичную: неопределенная локальная переменная или метод 'user_session ' – Fizz

 Смежные вопросы

  • Нет связанных вопросов^_^