2016-01-03 3 views
0

Я довольно новичок в RoR, и я пытаюсь узнать лучший способ добиться того, чего хочу. В настоящее время я должен вводить поля для поиска книг и пользователей на одной странице. После ввода идентификатора книги он будет искать в базе данных и отображать подробную информацию о книге на этой странице. Если возвращенная книга имеет владельца (пользователя), поле ввода для пользователя будет заполнено автоматически, и информация о пользователе будет отображаться на той же странице. Если книга не имеет владельца, мне нужно ввести идентификатор пользователя в другом поле ввода, и будет отображаться информация о пользователе.Несколько параметров для двух разных объектов на одной странице

То, как я делаю это сейчас, заключается в том, что ввод идентификатора книги и идентификатора пользователя будет назначен параметрам [: book_id] и параметрам [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 %> 

Вот код в контроллере:

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 

Спасибо за помощь!

Редактировать: Спасибо, что ответ Стив. Но в настоящее время проблема заключается в том, что я не могу найти способ сохранить оба параметра одновременно. После ввода идентификатора книги и ввода ввода информация о книге будет отображаться отлично. Однако, когда я ввожу идентификатор пользователя next и нажимаю enter, в параметрах сохраняется только идентификатор пользователя, а параметра [: book_id] нет. То, что я хочу достичь, это что-то вроде:/проверка book_id = 1234 & user_id = 5678

+0

Какова связь между '' book' и user'? – guyaloni

+0

Книга принадлежит пользователю, и у пользователя много книг –

ответ

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 
+0

Ваше решение решит мою проблему! Большое спасибо. Кстати, есть ли какая-либо польза от использования области вместо использования встроенного метода find_by? –

+0

Преимущество областей заключается в том, что вы можете использовать их в цепочке ('Model.scope_one (params1) .scope_two (params2)'), и без областей видимости вы можете получить Error. Но в вашем случае вы можете использовать 'find_by'. –

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 возвратит ноль.

+0

Я не могу. Поскольку в начале @ книга равна нулю, а оценка @ book.user_id приведет к отсутствию метода для ошибки класса nil. –

+0

Да, но во второй строке моего решения мы назначаем @book – SteveTurczyn

+0

Но при первом запуске params ["book_id"] равно nil, что означает Book.find_by (book_id: params ["book_id"]) вернет nil. –

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