为什么水豚找不到我的元素?
我正在为一个项目制作一个假 Twitter 应用程序,但我遇到了 Capybara 无法识别我的 :username 元素的问题。我的代码中是否缺少某些内容或者可能是我尚未完成的过程?我对编码还很陌生,所以我肯定会错过一些相对简单的东西。我包括我的 ApplicationController、UserController 和 TweetController。提前致谢!
require './config/environment'
class ApplicationController < Sinatra::Base
configure do
set :public_folder, 'public'
set :views, 'app/views'
enable :sessions
set :session_secret, 'secret'
end
get '/' do
erb ':index'
end
helpers do
def current_user
@user ||= User.find_by(id: session[:user_id]) if session[:user_id]
end
def logged_in?
!!current_user
end
end
end
class UsersController < ApplicationController
get '/users/:slug' do
@user = User.find_by_slug(params[:slug])
erb :"users/show"
end
get '/signup' do
if !logged_in?
erb ":users/signup"
else
redirect to "/tweets"
end
end
post '/signup' do
if params[:username] == "" || params[:email] == "" || params[:password] == ""
redirect to "/signup"
else
@user = User.new(username: params[:username], email: params[:email], password: params[:password])
@user.save
session[:user_id] = @user.id
redirect to "/tweets"
end
end
get '/login' do
if !logged_in?
erb :"users/login"
else
redirect to "/tweets"
end
end
post '/login' do
a = User.find_by(username: params[:username])
if a && a.authenticate(params[:password])
session[:user_id] = @user
redirect to "/tweets"
else
redirect to "/signup"
end
end
get '/logout' do
if logged_in?
session.destroy
redirect to "/login"
else
redirect to "/"
end
end
end
class TweetsController < ApplicationController
get '/tweets' do
if logged_in?
@tweets = Tweet.all
erb 'tweets/tweets'
else
redirect to '/login'
end
end
get '/tweets/new' do
if logged_in?
erb 'tweets/create_tweet'
else
redirect to 'login'
end
end
post '/tweets' do
if logged_in?
erb 'tweets/create_tweet'
else
redirect to '/login', 200
end
end
get '/tweets/:id' do
if logged_in?
@tweet = Tweet.find_by_id(params[:id])
erb 'tweets/show_tweet'
else
redirect to '/login'
end
end
patch '/tweets/:id' do
@tweet = Tweet.find_by_id(params[:id])
if !params[:content].empty?
@tweet.update(content: params[:content])
@tweet.save
redirect 'tweets/#{params[:id]}'
else
redirect 'tweets/#{params[:id]}/edit'
end
end
post '/tweets/:id/delete' do
@tweets = Tweet.find_by_id(params[:id])
if current_user == @tweet.user
@tweet.delete
redirect to '/tweets'
else
redirect to '/tweets/#{params[:id]}'
end
end
end
Failure/Error: fill_in(:username, :with => "becky567")
Capybara::ElementNotFound:
Unable to find field :username that is not disabled
测试代码:
describe 'index action' do
context 'logged in' do
it 'lets a user view the tweets index if logged in' do
user1 = User.create(:username => "becky567", :email => "[email protected]", :password => "kittens")
tweet1 = Tweet.create(:content => "tweeting!", :user_id => user1.id)
user2 = User.create(:username => "silverstallion", :email => "[email protected]", :password => "horses")
tweet2 = Tweet.create(:content => "look at this tweet", :user_id => user2.id)
visit '/login'
fill_in(:username, :with => "becky567")
fill_in(:password, :with => "kittens")
click_button 'submit'
visit "/tweets"
expect(page.body).to include(tweet1.content)
expect(page.body).to include(tweet2.content)
end
end
显示推文 HTML:
<p><%= @tweet.content %></p>
<form action="/tweets/<%= @tweet.id %>" method="post">
<input type="hidden" name="_method" value="delete">
<input type="submit" value="Delete Tweet">
</form>
<a href="/tweets/<%= @tweet.id %>/edit">Edit Tweet</a>
推文 HTML:
<h1> Welcome, <%[email protected] %></h1>
<% @tweets.each do |tweet| %>
<p><a href="tweet/<%=tweet.id%>"><%tweets.content %></a></p>
<% end %>
显示用户 HTML:
<h1><%[email protected]%></h1>
<a href="/tweets/new"> New Tweet</a>
<% @user.tweets.each do |tweet|%>
<%= tweet.content %><a href="/tweets/<%=tweet.id%>/edit">EDIT</a>
<% end %>
<a href="/logout">Log Out</a>
登录 HTML:
<h1>Login to Fwitter</h1>
<form action="/login" method="post">
<label>Username: </label><input type="username" name="username">
<label>Password: </label><input type="password" name="pasword">
<input type="submit" value="submit">
</form>
注册 HTML:
<h1> Sign Up for Fwitter</h1>
<form action="/signup" method="post">
<label for="username">Username</label>
<input type="text" id="username" name="username">
<label for="email">Email</label>
<input type="text" id="email" name="email">
<label for="password">Password</label>
<input type="text" id="password" name="password">
<button type="submit" value="submit">Sign Up</button>
</form>
I'm making a fake twitter app for a project and I have this issue with Capybara not recognizing my :username element. Is there something that I'm missing in my code or perhaps a process that I haven't done? I'm still pretty new to coding so I could definitely be missing something relatively simple. I'm including my ApplicationController, UserController, and TweetController. Thanks in advance!
require './config/environment'
class ApplicationController < Sinatra::Base
configure do
set :public_folder, 'public'
set :views, 'app/views'
enable :sessions
set :session_secret, 'secret'
end
get '/' do
erb ':index'
end
helpers do
def current_user
@user ||= User.find_by(id: session[:user_id]) if session[:user_id]
end
def logged_in?
!!current_user
end
end
end
class UsersController < ApplicationController
get '/users/:slug' do
@user = User.find_by_slug(params[:slug])
erb :"users/show"
end
get '/signup' do
if !logged_in?
erb ":users/signup"
else
redirect to "/tweets"
end
end
post '/signup' do
if params[:username] == "" || params[:email] == "" || params[:password] == ""
redirect to "/signup"
else
@user = User.new(username: params[:username], email: params[:email], password: params[:password])
@user.save
session[:user_id] = @user.id
redirect to "/tweets"
end
end
get '/login' do
if !logged_in?
erb :"users/login"
else
redirect to "/tweets"
end
end
post '/login' do
a = User.find_by(username: params[:username])
if a && a.authenticate(params[:password])
session[:user_id] = @user
redirect to "/tweets"
else
redirect to "/signup"
end
end
get '/logout' do
if logged_in?
session.destroy
redirect to "/login"
else
redirect to "/"
end
end
end
class TweetsController < ApplicationController
get '/tweets' do
if logged_in?
@tweets = Tweet.all
erb 'tweets/tweets'
else
redirect to '/login'
end
end
get '/tweets/new' do
if logged_in?
erb 'tweets/create_tweet'
else
redirect to 'login'
end
end
post '/tweets' do
if logged_in?
erb 'tweets/create_tweet'
else
redirect to '/login', 200
end
end
get '/tweets/:id' do
if logged_in?
@tweet = Tweet.find_by_id(params[:id])
erb 'tweets/show_tweet'
else
redirect to '/login'
end
end
patch '/tweets/:id' do
@tweet = Tweet.find_by_id(params[:id])
if !params[:content].empty?
@tweet.update(content: params[:content])
@tweet.save
redirect 'tweets/#{params[:id]}'
else
redirect 'tweets/#{params[:id]}/edit'
end
end
post '/tweets/:id/delete' do
@tweets = Tweet.find_by_id(params[:id])
if current_user == @tweet.user
@tweet.delete
redirect to '/tweets'
else
redirect to '/tweets/#{params[:id]}'
end
end
end
Failure/Error: fill_in(:username, :with => "becky567")
Capybara::ElementNotFound:
Unable to find field :username that is not disabled
Test code:
describe 'index action' do
context 'logged in' do
it 'lets a user view the tweets index if logged in' do
user1 = User.create(:username => "becky567", :email => "[email protected]", :password => "kittens")
tweet1 = Tweet.create(:content => "tweeting!", :user_id => user1.id)
user2 = User.create(:username => "silverstallion", :email => "[email protected]", :password => "horses")
tweet2 = Tweet.create(:content => "look at this tweet", :user_id => user2.id)
visit '/login'
fill_in(:username, :with => "becky567")
fill_in(:password, :with => "kittens")
click_button 'submit'
visit "/tweets"
expect(page.body).to include(tweet1.content)
expect(page.body).to include(tweet2.content)
end
end
Show tweets HTML:
<p><%= @tweet.content %></p>
<form action="/tweets/<%= @tweet.id %>" method="post">
<input type="hidden" name="_method" value="delete">
<input type="submit" value="Delete Tweet">
</form>
<a href="/tweets/<%= @tweet.id %>/edit">Edit Tweet</a>
Tweets HTML:
<h1> Welcome, <%[email protected] %></h1>
<% @tweets.each do |tweet| %>
<p><a href="tweet/<%=tweet.id%>"><%tweets.content %></a></p>
<% end %>
Show user HTML:
<h1><%[email protected]%></h1>
<a href="/tweets/new"> New Tweet</a>
<% @user.tweets.each do |tweet|%>
<%= tweet.content %><a href="/tweets/<%=tweet.id%>/edit">EDIT</a>
<% end %>
<a href="/logout">Log Out</a>
Login HTML:
<h1>Login to Fwitter</h1>
<form action="/login" method="post">
<label>Username: </label><input type="username" name="username">
<label>Password: </label><input type="password" name="pasword">
<input type="submit" value="submit">
</form>
Signup HTML:
<h1> Sign Up for Fwitter</h1>
<form action="/signup" method="post">
<label for="username">Username</label>
<input type="text" id="username" name="username">
<label for="email">Email</label>
<input type="text" id="email" name="email">
<label for="password">Password</label>
<input type="text" id="password" name="password">
<button type="submit" value="submit">Sign Up</button>
</form>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论