【问题标题】:Rails 3 Routes issue on form Edit表单上的 Rails 3 Routes 问题编辑
【发布时间】:2011-05-11 05:10:23
【问题描述】:

基本上发生的事情是我可以创建一个新项目,并将其保存到我的数据库中的表中。但是当我去编辑项目时,表单打开,我进行了更改,然后当我去提交时,它会将我带到与编辑页面相同的 url 并给我路由错误没有路由匹配“/support/14 /edit”虽然如果您在地址栏中输入它,它会很好地打开编辑表单,但没有保存我的任何更改。所以这是我的代码。

routes.rb

resources :support

support_controller.rb

def new
  @support_item = Support.new

  respond_to do |format|
    format.html # new.html.erb
    format.xml  { render :xml => @support_item }
  end
end

# GET /support/1/edit
def edit
  @support_item = Support.find(params[:id])
end

# POST /support
# POST /support.xml
def create
  @support_item = Support.new(params[:support_item])

  respond_to do |format|
    if @support_item.save
      format.html { redirect_to("/support", :notice => 'Question was successfully created.') }
    else
      format.html { render :action => "new" }
    end
  end
end

# PUT /support/1
# PUT /support/1.xml
def update
  @support_item = Support.find(params[:id])

  respond_to do |format|
    if @support_item.update_attributes(params[:support_item])
      format.html { redirect_to("/", :notice => 'Question was successfully updated.') }
      format.xml  { head :ok }
    else
      format.html { render :action => "edit" }
      format.xml  { render :xml => @support_item.errors, :status => :unprocessable_entity }
    end
  end
end

support.rb

class Support < ActiveRecord::Base
  belongs_to :role

  scope :admin_available, order("role_id ASC") do
      Support.all
  end

  def self.available(user)
    questions =   where(:role_id => 1)
    questions +=  where(:role_id => user.roles)
    questions
  end
end

_form.html.erb

  <% if @support_item.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@support_item.errors.count, "error") %> prohibited this question from being saved:</h2>

      <ul>
      <% @support_item.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label "Support item for:" %><br />
    <%= f.collection_select :role_id, Role.find_by_max(5), :id, :name, {:default => 'everyone'} %>
  </div>
  <div class="field">
    <%= f.label :question %><br />
    <%= f.text_field :question, :class => 'genForm_question'%>
  </div>
  <div class="field">
    <%= f.label :answer %><br />
    <%= f.text_area :answer, :class => 'genForm_textarea' %>
  </div>
  <div class="field">
    <%= f.label :url %><br />
    <%= f.text_field :url, :class => 'genForm_question' %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>

new.html.erb

<h1>New Support Item</h1>

<% form_for @support_item, :url => { :action => "create" }, :html => { :method => :post } do |f| %>
    <%= render 'form', :f => f %>
<% end %>

edit.html.erb

<h1>Editing Support Item</h1>

<% form_for @support_item, :url => { :action => "edit" }, :html => { :method => :post } do |f| %>
        <%= render 'form', :f => f %>
<% end %>

我相信这就是所有相关的代码。

【问题讨论】:

  • 为什么在你的编辑表单中你用 POST 动词发回编辑?你不应该用 PUT 动词发布到“更新”吗?
  • 见下面@scragz 的回答。只需将其保留为 form_for @post for new 和 edit,rails 就可以计算出端点和动词的机制。

标签: ruby-on-rails-3 forms routing


【解决方案1】:
<h1>Editing Support Item</h1>

<% form_for @support_item do |f| %>
        <%= render 'form', :f => f %>
<% end %>

您正在覆盖 URL。如果您使用标准休息做所有事情,它应该能够像那样自动生成。如果这不起作用,只要知道您不想提交到 /support_items/1/edit,而是想提交到 /support_items/1。

【讨论】:

  • 问题不在于我的代码,我稍微挖掘了一下,发现“支持”是由rails保留的。我用“faq”代替“support”创建了完全相同的东西,它无缝地工作。然后我所要做的就是在 routes.rb 文件中创建资源 :faq, :path => 'support'
  • 那很好。不过,您仍然可以简化这些表格!你会发现 Rails 就是让 Rails 为所欲为。
猜你喜欢
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
相关资源
最近更新 更多