我是rails初学者,我使用rails generate scaffold
创建了3个模型/控制器/视图:
当我转到http://localhost:3000/subjects/1/topics
时,Rails会列出空的主题列表,点击“新主题”链接后,您将转到http://localhost:3000/topics/new
。
我应该如何获取“新主题”的链接,将用户带到http://localhost:3000/subjects/:id/topics/new
而不是http://localhost:3000/topics/new
,并且新主题表单是否应提交给http://localhost:3000/subjects/:id/topics/new
而不是{{} 1}}?
视图/主题/索引:
http://localhost:3000/topics
控制器/主题:
<h1>Listing topics</h1>
<table>
<tr>
<th>Name</th>
<th></th>
<th></th>
<th></th>
</tr>
<% @topics.each do |topic| %>
<tr>
<td><%= topic.name %></td>
<td><%= link_to 'Show', topic %></td>
<td><%= link_to 'Edit', edit_topic_path(topic) %></td>
<td><%= link_to 'Destroy', topic, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</table>
<br />
<%= link_to 'New Topic', new_topic_path %>
新主题形式:
def new
@topic = Topic.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @topic }
end
end
def edit
@topic = Topic.find(params[:id])
end
def create
@topic = Topic.new(params[:topic])
@topic.subject_id = params[:project_id]
respond_to do |format|
if @topic.save
format.html { redirect_to subject_path(@topic.subject_id), notice: 'Topic was successfully created.' }
format.json { render json: @topic, status: :created, location: @topic }
else
format.html { render action: "new" }
format.json { render json: @topic.errors, status: :unprocessable_entity }
end
end
end
路线:
<%= form_for(@topic) do |f| %>
<% if @topic.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@topic.errors.count, "error") %> prohibited this topic from being saved:</h2>
<ul>
<% @topic.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
答案 0 :(得分:0)
声明嵌套资源后,请不要再次声明这些资源。
不建议深度嵌套资源。您应该考虑进行浅层嵌套,您可以在Rails Routing Guide中阅读此内容。
避免深度嵌套的一种方法(如上所述)是生成 在父级下限定的集合操作,以便有意义 层次结构,但不嵌套成员操作。换一种说法, 仅构建具有最少信息量的路由 唯一标识资源,如下所示:
resources :posts do
resources :comments, only: [:index, :new, :create]
end
resources :comments, only: [:show, :edit, :update, :destroy]
这个想法在描述路线和深层之间取得平衡 嵌套。
答案 1 :(得分:0)
当您转到http://localhost:3000/subjects/1/topics
时,调用控制器index
的操作TopicsController
并将params[:subject_id]
设置为1
。
因此,在您的控制器操作中,您必须检查此参数并过滤主题(如果已给出)
def index
if params[:subject_id].present?
@subject=Subject.find params[:subject_id]
@topics=@subject.topics
else
@topics=Topic.all
end
end
并且在索引视图中,如果存在@subject,则必须使用此URL:
<%= link_to 'New Topic', @subject.present? ? new_subject_topic_path(@subject) : new_topic_path %>
在您的主题新操作中,您再次获得:subject_id
作为参数:
def new
@subject=Subject.find params[:subject_id]
@topic = @subject.topics.new
end
然后在您的主题表单中,您可以在隐藏字段中转发subject_id
:
<%= form_for(@topic) do |f| %>
...
<%= f.hidden_field :subject_id %>
...
<% end %>
你的TobicsController的其余部分可以保持不变。主题由subject_id