#ruby-on-rails #partial
#ruby-on-rails #частично
Вопрос:
Я хочу иметь страницу, которая является полноценной страницей, т. Е. я могу вызвать ее с URL, например, таким :
/path/to/client/33
но тогда я хочу иметь возможность вызывать / отображать ее с другой страницы, т. Е. (псевдокод)
/path/to/customer/678
...find client id.....
render :client, :id => 33 #inside the customer page
render :customer
Я понимаю, что могу сделать это как частичное, чего я не могу понять, так это как передавать параметры между ними.
Я также думал о макете, но тогда как мне организовать, чтобы клиентский контроллер запускался первым? Чтобы я мог найти идентификатор клиента, а затем отобразить client.
Думайте о клиенте как об одной сущности, «имеющей» много клиентов.
Ответ №1:
# app/views/your_controller/_client.html.erb
The Client is <%= client.name %>
# app/views/your_controller/customer.html.erb
The Customer is <%= @customer.name %>
<%= render :partial => 'client', :locals => { :client => @client } %>
# app/views/your_controller/client.html.erb
<%= render :partial => 'client', :locals => { :client => @client } %>
# your_controller.rb
def customer
@customer = Customer.find(params[:id])
@client = @customer.client
end
def client
@client = Client.find(params[:id])
# i forget if you need to assign it client to make the partial work
client = @client
end
Комментарии:
1. спасибо … хотя один дополнительный вопрос.. Я хочу передать client_id (и клиентский контроллер для выполнения его работы), а не объект @client.
2. Я не понимаю вашего вопроса, но я предложу это. Хороший принцип проектирования — тонкие контроллеры, толстые модели. если вы просто хотите передать идентификатор клиента вместо объекта, то вы можете изменить приведенный выше код, чтобы сделать именно это. в представлении у вас будет <%= client_id %>, а в контроллере вы должны установить client_id в параметры [:id]. Удачи!
3. спасибо, позвольте мне перефразировать это … Я могу передать client_id, но если информация о клиенте отображается перед информацией о клиенте, как мне заставить клиента быть выполненным первым, чтобы он мог получить информацию, или это именно то, что произойдет, потому что я использую /customer / 333. Попробую завтра ..10x
4. хм .. похоже, не работает. Цель partial, похоже, заключается просто в рендеринге частичного шаблона. Что я пытаюсь сделать, так это инициировать внутренний вызов diff URL (имитирующий отдельный запрос), получить данные ответа и интегрировать их в текущий рендеринг шаблона. Чтобы клиентская часть могла работать и вызываться как отдельный объект, а также быть интегрирована в выходные данные других контроллеров (Customer)
5. либо я не понимаю, что вы пытаетесь сделать, либо вы не понимаете, что вы можете сделать с Rails. Вам не нужно делать отдельный запрос только для того, чтобы сохранить «клиентскую часть» как отдельный объект. У вас есть доступ к этой модели или любой другой модели, как это бывает, с вашего пользовательского контроллера. В духе попытки ответить на фактический вопрос, вы могли бы использовать rest-client gem , чтобы отправить запрос, который вы хотите, к клиентскому контроллеру, а затем использовать ответ на вашей странице клиента.