Могу поспорить, что у других была эта проблема, но я не нашел хорошего решения.
В приложении rails вы можете захотеть делать вещи с одной моделью из разных мест.
Скажите, у вас есть страница Projects, где вы перечисляете все проекты и имеете форму для создания новых.Эта форма также служит формой обновления, если (: id) присутствует.
Допустим, у вас также есть страница показа клиентов, где вы также перечисляете все проекты для конкретного клиента.Здесь вы также хотите редактировать и создавать проекты (для этого клиента)
Когда контроллер получит это, он отправит пользователя на страницу, указанную в блоке response_to.Но иногда вы хотите вернуться на страницу проектов, а иногда - на страницу показа клиентов.
При отправке с ajax.Для страницы проектов вы заполняете ее javascript и ERB, которые не обязательно должны соответствовать странице показа клиентов.
Существует ли элегантный способ справиться с этим без тонны операторов if?
Редактировать
Я немного экспериментировал на тестапе с двумя проектами и задачами с эшафотами.
Не думаю, что это элегантно.Для многих, если заявления и не очень СУХОЙ.
Как мне сделать это лучше?
вот код
проектов / шоу
<p id="notice"><%= notice %></p>
<p>
<b>Name:</b>
<%= @project.name %>
</p>
<% @todos.each do |todo| %>
<p>
<%= todo.name %><%= link_to 'Edit', show_path(:id => @project.id.to_s, :todo_id => todo.id.to_s)%>
</p>
<% end %>
<%= render 'todos/form' %>
<%= link_to 'Edit', edit_project_path(@project) %> |
<%= link_to 'Back', projects_path %>
задач / _form
<% if params[:todo_id].nil? %>
<%= form_for([@project,@todo], :url => project_make_todo_path( @project)) do |f| %>
<% if @todo.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@todo.errors.count, "error") %> prohibited this todo from being saved:</h2>
<ul>
<% @todo.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<%= f.hidden_field :project_id %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
<% else %>
<%= form_for([@project,@todo], :url => project_update_todo_path( @project, @todo)) do |f| %>
<% if @todo.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@todo.errors.count, "error") %> prohibited this todo from being saved:</h2>
<ul>
<% @todo.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<%= f.hidden_field :project_id %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
<% end %>
частей projects_controller.rb
def project_make_todo
@project = Project.find(params[:id])
@todo = @project.todos.build(params[:todo])
respond_to do |format|
if @todo.save
format.html { redirect_to( @project, :notice => 'Todo was successfully created.') }
format.xml { render :xml => @project, :status => :created, :location => @project }
else
format.html { render :action => "new" }
format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
end
end
end
def project_update_todo
@todo = Todo.find(params[:todo_id])
@project = Project.find(params[:id])
respond_to do |format|
if @todo.update_attributes(params[:todo])
format.html { redirect_to(@project, :notice => 'Todo was successfully updated.') }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
end
end
end
частей маршрутов. Rb
match 'projects/:id/project_todo' => 'projects#project_make_todo', :as => :project_make_todo
match 'projects/:id/:todo_id/project_todo' => 'projects#project_update_todo', :as => :project_update_todo