我在RoR中很新,我正在努力学习一种更好的方法来实现我想要的。 目前,我必须输入框以在一个页面中搜索书籍和用户。输入图书ID后,它将搜索数据库并在此页面中显示有关图书的一些详细信息。 如果返回的书具有所有者(用户),则将自动填写用户的输入框,并且将在同一页面中显示有关用户的信息。如果图书没有所有者,我需要在另一个输入框中输入用户ID,并显示有关该用户的信息。
我现在这样做的方式是将book id和user id的输入分配给params [:book_id]和params [user_id]。如果@book和@user的值存在,将显示书籍和用户的信息。 以下是视图中的代码:
<form>
<div>
<p>BookID</p>
<input type='text' value='<%= params[:book_id]%>' name = 'book_id' placeholder='Enter Book ID here'/>
</div>
</form>
<form>
<div>
<p>User ID</p>
<input type='text' value='<%= params[:user_id]%>' name = 'user_id' placeholder='Enter User ID here'/>
</div>
</form>
<% if @book %>
<%= render 'book'%>
<% end %>
<% if @user%>
<%= render :partial => 'users/user'%>
<% end %>
这是Controller中的代码:
def checking
@book = Book.find_by(book_id: params["book_id"])
@user = User.find_by(user_id: params[:user_id])
if @book && @book.user
@user = @book.user
end
end
感谢您的帮助!
编辑:谢谢史蒂夫的回答。但目前我遇到的问题是我无法找到同时保留两个参数的方法。输入图书ID并按回车键后,图书信息将完美显示。但是,当我输入用户ID next并按Enter键时,只有用户ID保留在params中,并且param [:book_id]不存在。我想要实现的是:/ checking?book_id = 1234&amp; user_id = 5678
答案 0 :(得分:0)
你可以这样做......
def checking
@book = Book.find_by(book_id: params["book_id"])
@user = User.find_by(user_id: (@book.try(:user_id) || params[:user_id]))
end
这将使用@book.user_id
作为find_by,除非它不存在或除非没有@book对象退出,在这种情况下它将使用params
值。
try
方法会尝试在user_id
上致电@book
,但如果@book
只是nil
,try
的结果将会返回为零。
答案 1 :(得分:0)
如果我理解你:
您应该为对象book_id
和user_id
view.html.slim
= form_tag checking_path do
= text_field_tag :book_id
= text_field_tag :user_id
= submit_tag :search
- if @book
= render 'book_partial_path'
- if @user
= render 'user_partial_path'
模特书:
scope :search_book, (book_id)-> { find_by(book_id: book_id) if book_id }
模型用户:
scope :search_user, (user_id)-> { find_by(user_id: user_id) if user_id }
控制器:
def checking
@book = search_book(params[:book_id])
@user = @book.try(:user) || search_user(params[:user_id]))
end