gpt4 book ai didi

ruby-on-rails-3 - 如何在此文件中使用 "Form_tag"而不是 "Form_for"

转载 作者:行者123 更新时间:2023-12-03 09:20:14 25 4
gpt4 key购买 nike

我是 Ruby on Rails 的新手,Michael Hartl 的优秀著作《Ruby on Rails 教程》给了我很大帮助。我已经读到了第 8 章,现在正在做该章的练习。我在练习 1 中遇到(我假设一个典型的“新手”)问题。在这个练习中,它被要求“1.重构登录表单以使用 form_tag 代替 form_for”。两天来,我一直试图在 Stackoverflow、Google、Railscast 和许多其他“网络搜索”中寻找这方面的帮助,但我似乎没有找到回答这个问题所需的帮助。我试图用 form_tag 修改的文件如下:

<% provide(:title, "Sign in") %>
<h1>Sign in</h1>

<div class="row">
<div class="span6 offset3">
<%= form_for(:session, url: sessions_path) do |f| %>

<%= f.label :email %>
<%= f.text_field :email %>

<%= f.label :password %>
<%= f.password_field :password %>

<%= f.submit "Sign in", class: "btn btn-large btn-primary" %>
<% end %>

<p>New user? <%= link_to "Sign up now!", signup_path %></p>
</div>
</div>

我在这个应用程序中使用 Rails 3.2.3。有人能指出我正确的方向吗?谁能帮我解决这个问题?我将不胜感激。

这是使用 form_tag 的实现:
<% provide(:title, "Sign in") %>
<h1>Sign in</h1>

<div class="row">
<div class="span6 offset3">
<%= form_tag( url: sessions_path ) do %>

<%= label_tag :email %>
<%= text_field_tag :email %>

<%= label_tag :password %>
<%= password_field_tag :password %>

<%= submit_tag "Sign in", class: "btn btn-large btn-primary" %>
<% end %>

<p>New user? <%= link_to "Sign up now!", signup_path %></p>
</div>
</div>

我正在使用 Rspec 2.9.0 及以下是失败的测试:
describe "signin page" do
before { visit signin_path }

it { should have_selector('h1', text: 'Sign in') }
it { should have_selector('title', text: 'Sign in') }
end


describe "with invalid information" do
before { click_button "Sign in" }

it { should have_selector('title', text: 'Sign in') }
it { should have_selector('div.alert.alert-error', text: 'Invalid') }

describe "after visiting another page" do
before { click_link "Home" }
it { should_not have_selector('div.alert.alert-error') }
end
end


describe "with valid information" do
let(:user) { FactoryGirl.create(:user) }
before do
fill_in "Email", with: user.email
fill_in "Password", with: user.password
click_button "Sign in"
end

it { should have_selector('title', text: user.name) }
it { should have_link('Profile', href: user_path(user)) }
it { should have_link('Sign out', href: signout_path) }
it { should_not have_link('Sign in', href: signin_path) }

describe "followed by signout" do
before { click_link "Sign out" }
it { should have_link('Sign in') }
end
end

这是我的路由文件:
SampleApp::Application.routes.draw do
resources :users
resources :sessions, only: [:new, :create, :destroy]


get "users/new"

root to: 'static_pages#home'

match '/signup', to: 'users#new'
match '/signin', to: 'sessions#new'
match '/signout', to: 'sessions#destroy', via: :delete

match '/help', to: 'static_pages#help'
match '/about', to: 'static_pages#about'
match '/contact', to: 'static_pages#contact'
end

最佳答案

我也刚刚完成了这个练习,所以我绝不是专家;但是,这是对我有用并通过了所有测试的代码:

../app/views/sessions/new.html.erb

<% provide(:title, "Sign in") %>
<h1>Sign in</h1>

<div class="row">
<div class="span 6 offset 3">
<%= form_tag sessions_path do %>

<%= label_tag :email %>
<%= text_field_tag :email, params[:email] %>

<%= label_tag :password %>
<%= password_field_tag :password %>

<%= submit_tag "Sign in", class: "btn btn-large btn-primary" %>
<% end %>

<p>New User?<%= link_to "Sign Up Now", signup_path %> </p>
</div>
</div>

我还需要更改 ../app/controllers/sessions_contoller
class SessionsController < ApplicationController

def new
end

def create
user = User.find_by_email(params[:email])
if user && user.authenticate(params[:password])
session[:user] = user.id
sign_in user
redirect_to user
else
flash.now[:error] = 'Invalid email/password combination'
render 'new'
end
end

def destroy
sign_out
redirect_to root_path
end
end

虽然这有效,但我不完全确定为什么会这样;如果有人可以解释为什么需要更改 Controller ,将不胜感激。我知道这可以作为一个单独的问题提出,但它与 OP 密切相关,我相信我们都会发现它不仅在理解如何使其工作以及为什么以这种方式工作方面都非常有用。以下是原始 View 和 Controller 文件:

原始'form_for' new.html.erb:
<% provide(:title, "Sign in") %>
<h1>Sign in</h1>

<div class="row">
<div class="span6 offset3">
<%= form_for(:session, url: sessions_path) do |f| %>

<%= f.label :email %>
<%= f.text_field :email %>

<%= f.label :password %>
<%= f.password_field :password %>

<%= f.submit "Sign in", class: "btn btn-large btn-primary" %>
<% end %>

<p>New user? <%= link_to "Sign up now!", signup_path %></p>
</div>
</div>

和原来的sessions_controller:
class SessionsController < ApplicationController

def new
end

def create
user = User.find_by_email(params[:session][:email])
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_to user
else
flash.now[:error] = 'Invalid email/password combination'
render 'new'
end
end

def destroy
sign_out
redirect_to root_path
end
end

关于ruby-on-rails-3 - 如何在此文件中使用 "Form_tag"而不是 "Form_for",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10489314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com