【问题标题】:ruby on rails: form_for doesn't redirectruby on rails:form_for 不重定向
【发布时间】:2016-01-15 13:36:24
【问题描述】:

我的 form_for 没有重定向到我指定的操作。我实在想不出问题出在哪里。

我的观点详解:

<!-- Comments Form -->
    <div class="well">
      <h4>Comment:</h4>
      <form class="comment-form">
        <div class="form-group">
          <%= form_for(:comments, :url => {:action => 'post_comment'}) do |f| %>
              <%= f.text_area(:content, :rows => "3", :class => "form-control new-comment") %>
              <%= f.hidden_field :book_id, :value => @comments[:book_id] %>
              <%= f.hidden_field :user_id, :value => session[:user_id] %>
              <%= submit_tag("Send") %>
          <% end %>
        </div>
      </form>
    </div>

我的控制器:

def detailedbook
    @book = Book.find(params[:id])
    @comments = Comments.new
    @rating = Rates.new(:book_id => params[:id], :user_id => session[:user_id])
    @previouscomments = Comments.where(:book_id => params[:id] )
  end
def post_comment
    @comments = Comments.new(params.require(:comments).permit(:content, :book_id, :user_id))
    @comments.book_id = params[:id]
    if @comments.save
      redirect_to(:action => 'showbooks')
    else
      redirect_to(:action => 'home')
    end
  end

似乎提交甚至没有发生。我做错了什么?

【问题讨论】:

  • 您可以发布表单提交的日志吗?
  • 您能否在编辑中添加为您的表单呈现在页面上的 html?始终值得研究这一点,因为它是呈现的 html 决定了随表单提交的内容,而且通常不是您期望从您的 erb 文件中获得的内容。
  • 我在哪里可以得到表单提交的日志?
  • 我在查看页面源时发现了一个错误。谢谢你的想法,我不认为我在那里能看到任何东西:)

标签: ruby-on-rails forms


【解决方案1】:

我认为您指定的url 无法正常工作。假设 Comments 是您的控制器的名称:

<%= form_for(:comments, :url => post_comment_comments_url, :method=> "POST" ) do |f| %>

这应该适合你。

【讨论】:

  • cmets 不是我的控制器的名字。应该是吗?
  • post_comment_comment_url 是什么意思?这是动作名称吗?
  • 在您的表单定义中,您没有指定控制器的名称以及操作。当您提交表单时,Rails 不知道将您带到哪里。您可以指定控制器的名称以及操作,或者指定您的目标网址和请求方法,就像我在回答中提到的那样。
  • 顺便说一句,你的控制器叫什么名字?
【解决方案2】:

我假设您有一个“评论”模型,并且您共享的内容在 cmets_controller 上。您不应该为您的模型使用复数形式。您应该对模型使用 Comment(此类的每个对象都是 1 条评论)和控制器的复数形式。

第一次尝试简单的解决方法:

<%= form_for(@comments, :url => {:action => 'post_comment'}) do |f| %>

@cmets 是您正在编辑/创建的实际实例。 Rails 意识到这一点并搜索正确的控制器 (cmets_controller)。

第二个选项 由于 rails 如何使 cmets 复数,这可能是一个问题。您可以在为表单页面呈现的 html 代码中检查这一点,或者使用以下方法绕过 rails 助手:

<%= form_tag(controller: 'comments', action: 'post_comment', method: 'post') ... %>

如果没有回答您的问题,请编辑您的帖子,添加您的模型和表单页面的 html 代码。

【讨论】:

    【解决方案3】:

    您必须找到相应的URI Pattern,它将指向相应的 Controller#Action 或您要调用的控制器方法。 Rails 不知道您在谈论哪个控制器操作。 您可以通过rake routes 找到它并查看Controller#Action 列并使用相应的URI Pattern。 它会像这样。

     Prefix Verb     URI Pattern                        Controller#Action
             root GET      /                                  home#index
           logout GET      /logout(.:format)                  session#destroy
            login GET      /login(.:format)                   session#new
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多