为什么将params传递给link_to不起作用?

时间:2015-06-23 14:44:41

标签: ruby-on-rails ruby ruby-on-rails-4 hyperlink

在尝试了初始评论中提到的几件事之后仍然无法正常工作 - 我已经在下面进行了修改,以反映这些努力/澄清一些事情。

问题摘要:我无法创建新帖子(答案),其中该帖子的parent_id等于相关问题的帖子的ID。用户从帖子的#show页面开始,点击"回答"。我以为下面的代码会将问题的ID传递给答案帖子' PARENT_ID。但事实并非如此。它返回parent_id = nil

我有一个帖子模型。帖子的post_type_id为1(问题)或2(答案)。

post_type_id = 2的所有帖子都有一个parent_id,指向正在回答的问题的ID。

关于帖子#show我有:

<% case post_type %> 
  <% when 1 %>
<%= link_to 'Answer', new_post_path(:parent_id => @post.id) %>
  <% else %>
<% end %>

当我点击它时,它会转到new_post页面并且网址是:     //本地主机:3000 /帖/新PARENT_ID = 6

(这个例子中的问题有id = 6,所以我认为看起来是正确的。)

在我的帖子控制器中,我有:

  def new
    @post = Post.new
  end

  def show
  end

  def create
    @post = Post.new(post_params)
    @post.user_id = current_user.id
    @post.parent_id = params[:parent_id]

    respond_to do |format|
      if @post.save
        format.html { redirect_to @post, notice: 'Post was successfully created.' }
        format.json { render :show, status: :created, location: @post }
      else
        format.html { render :new }
        format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
    end

  def post_params
    params.require(:post).permit(:user_id, :post_type_id, :title, :content, :accepted_answer_id, :parent_id, :score, :answer_count, :favorite_count)
  end

我的路线是:

          posts GET    /posts(.:format)                   posts#index
                POST   /posts(.:format)                   posts#create
       new_post GET    /posts/new(.:format)               posts#new
      edit_post GET    /posts/:id/edit(.:format)          posts#edit
           post GET    /posts/:id(.:format)               posts#show
                PATCH  /posts/:id(.:format)               posts#update
                PUT    /posts/:id(.:format)               posts#update
                DELETE /posts/:id(.:format)               posts#destroy

在new.html.erb中我有:

<h3>New Post</h3>
<%= render 'form' %>
<%= link_to 'Back', posts_path %>

_form.html.erb是:

<%= simple_form_for(@post) do |f| %>
<%= f.error_notification %>

<div class="form-inputs">
<%- f.association :user %>
<%= f.input :post_type_id, collection: post_types, label: 'What do you want to do?' %>
<%= f.input :title %>
<%= f.input :content %>
<%- f.input :accepted_answer_id %>
<%- f.input :parent_id %>
<%- f.input :score %>
<%- f.input :answer_count %>
<%- f.input :favorite_count %>
</div>

<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>

我非常感谢有关如何使其发挥作用的任何建议。

谢谢!

1 个答案:

答案 0 :(得分:2)

好的,所以您的用户点击了答案,然后将问题ID转发为ROOT参数(params[:parent_id]

现在,您想告诉您的新动作,您构建的帖子是问题的答案,因此您应该使用该参数

控制器/ posts_controller.rb

def new
  @post = Post.new
  @post.parent_id = params[:parent_id] if params[:parent_id]

然后在您的表单中,您可以添加隐藏字段(用户不必关心ID)。我相信如果字段.parent_id没有设置,它会留下一个空白值并且没有问题

视图/帖/ _form.html.erb

<%= f.hidden_field :parent_id %>

然后当您发布新答案时,将发送:parent_id,您不必担心它

控制器/ posts_controller.rb

def create
    @post = Post.new(post_params)
    @post.user_id = current_user.id
    # No need for the below line, :parent_id is already in post_params
    # @post.parent_id = params[:parent_id]

    respond_to do |format|
      if @post.save
        format.html { redirect_to @post, notice: 'Post was successfully created.' }
        format.json { render :show, status: :created, location: @post }
      else
        format.html { render :new }
        format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
  end

  def post_params
    params.require(:post).permit(..., :parent_id, ...)
  end

编辑:在评论中回答您的问题

为什么@post.parent_id = params[:parent_id]属于#new

使用这一行,你实际上设置了&#34;模板@post对象的#parent_id内存变量&#34;你正准备#new行动。现在,当您渲染视图时,默认情况下,每个表单助手都会在内存中加载值(如果存在)。当您执行f.input :content时,form_builder将生成HTML标记,但也会在内存中查找@post.content。由于模型生成为空白,因此没有值,因此它将显示空字段。因此,当您调用f.hidden_field :parent_id时,它实际上会找到变量(感谢我们刚刚添加的代码)并使用它。

&lt;% - 而不是&lt;%=

我个人从不使用<%-,我不得不谷歌,并找到this question<%-只会避免换行,所以它也可以正常工作

为何隐藏字段?

这只是用户体验的问题。隐藏字段将在HTML中写入,但会将其隐藏给用户。用户并没有对你的:parent_id发表任何不满。您正在使用ActiveRecord,因此ID看起来非常好,但如果您尝试其他数据库系统,您的ID可能看起来像0bef0600008de。而且您的用户肯定不在乎他正在添加问题0bef0600008de的答案。

然而,h可能会对此感兴趣:

_form.html.erb

<% if @post.parent_id %> <!-- if variable parent_id exists <=> we are writing an answer -->
  <h2>You are writing an answer for the question <%= Post.find(@post.parent_id).title %></h2>
<% end %>