0

我有一个包含表单的部分:

<% form_for :message, :url => { :action => "create" }, :html => { :id => 'form' } do |f| %>
  <%= f.error_messages %>

  <%= f.label :title, "title" %>
  <%= f.text_field :title %>

  <%= f.label :tag, "tag" %>
  <% if controller.controller_name == "tags" %>
    <%= f.text_field :tag_list, :value => @title %>
  <% else %>
    <%= f.text_field :tag_list %>
  <% end %>

  <%= f.label :name, "name" %>
  <%= f.text_field :name %>

  <%= f.label :email, "email" %>
  <%= f.text_field :email %>

  <%= f.label :title, "message" %>
  <%= f.text_area :content %>

  <%= f.submit 'submit' %>

<% end %>

我在两个控制器中使用它:消息和标签。它在消息控制器中运行良好,但在标签控制器中运行良好。当它在 tags#show 中呈现时,它会自动填充标签字段。当从 tags#show 提交消息时,我被重定向到网站的根目录,并显示一个 flash 错误“标签不存在”。

标签控制器:

class TagsController < ApplicationController
  before_filter :redirect_if_doesnt_exist#, :only => :show

  def show
    @title = Tag.find(params[:id]).name
    @tag = Tag.find(params[:id])
    @entries = Entry.paginate(Entry.find_tagged_with(@tag), 
            :page => params[:page], :per_page => 10, :order => "name")
    @messages = Message.paginate(Message.find_tagged_with(@tag), 
            :page => params[:page], :per_page => 10, :order => "updated_at DESC")
    @related_entries = Entry.tagged_with(@tag, :on => :tags)
    @related_tags = @related_entries.collect{|x|x.tags}.flatten.uniq
    @related_tags.delete(@tag)
  end

  private
  # Redirect if requested tag does not exist
  def redirect_if_doesnt_exist
    @tag = Tag.find(params[:id]) rescue nil
    if @tag.nil? # maybe "or @tag.empty?" could solve the empty tag issue
      flash[:error] = 'Tag does not exist.'
      redirect_to '/'
    end
  end
end

如果不清楚:部分显示在视图中,其中的表单只是不提交来自标签控制器的数据并被重定向。消息控制器的部分工作正常。这是一个 Rails 2.3.x 应用程序。感谢您阅读我的问题,感谢您抽出宝贵的时间。

4

1 回答 1

1

您的问题是表单部分的 URL 只是操作:

<% form_for :message, :url => { :action => "create" }, :html => { :id => 'form' } do |f| %>

如果您将其包含在不在的视图中messages_controller,它将调用错误的操作。如果您将此包含在标签视图中,它会尝试调用该create操作来tags_controller代替。

如果您也添加控制器,它可能会起作用:

<% form_for :message, :url => { :controller => :messages, :action => :create }, :html => { :id => 'form' } do |f| %>
于 2010-07-29T18:52:24.150 回答