一页中两个不同对象的多个参数

时间:2016-01-03 21:47:31

标签: ruby-on-rails ruby-on-rails-4

我在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

2 个答案:

答案 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只是niltry的结果将会返回为零。

答案 1 :(得分:0)

如果我理解你:

您应该为对象book_iduser_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