0

我是 Rails 初学者,我使用以下方法创建了 3 个模型/控制器/视图rails generate scaffold

  • 有很多主题的主题
  • 有很多注释的主题
  • 笔记

当我转到 时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而不是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 %>

路线:

resources :subjects do
  resources :topics do
    resources :notes
  end
end

resources :notes


resources :topics


resources :subjects

root :to => 'subjects#index'
4

2 回答 2

0

当您转到控制器http://localhost:3000/subjects/1/topics的操作时,将调用设置为.indexTopicsControllerparams[: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,您必须使用此网址:

<%= 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

于 2013-08-12T20:54:24.233 回答
0

声明嵌套资源后,不要再次声明这些资源。

不建议深度嵌套资源。你应该考虑做浅嵌套,你可以在Rails Routing Guide中阅读。

避免深度嵌套的一种方法(如上所述)是生成范围在父级下的集合操作,以便了解层次结构,但不嵌套成员操作。换句话说,只构建具有最少信息量的路由来唯一标识资源,如下所示:

resources :posts do
  resources :comments, only: [:index, :new, :create]
end
resources :comments, only: [:show, :edit, :update, :destroy]

这个想法在描述性路线和深度嵌套之间取得了平衡。

于 2013-08-12T20:44:49.187 回答