Rails链接未正确连接

时间:2013-08-12 20:11:08

标签: ruby-on-rails forms routes hyperlink

我是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 %>

2 个答案:

答案 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

与主题相关联