Rails - 如何渲染我自己的动作?

时间:2012-07-29 16:43:15

标签: ruby-on-rails templates action render

我正在建造简单的购物车。 这是路线,其中是数据:

  

匹配'kosik / osobni-udaje'=> 'home#cart_personal_data',:as =>   :cart_personal_data

此部分形式为订单= form_for @order do |f|) - 此表单转到:

  def update
    @order = Order.find(params[:id])
    fname = Order.check_attribute(params[:order][:first_name], 3, 40)
    lname = Order.check_attribute(params[:order][:last_name], 3, 40)

    if fname.nil? || lname.nil?
      @err = ''
      @err += 'Name is required<br />'
      @err += 'Surname is required<br />'
      render action: "/kosik/osobni-udaje"

    else
      respond_to do |format|
        if @order.update_attributes(params[:order])
          format.html { redirect_to cart_summary_path }
          format.json { head :no_content }
        else
          format.html { render action: "/kosik/osobni-udaje" }
          format.json { render json: @order.errors, status: :unprocessable_entity }
        end
      end
    end
  end

如果应用转到第一个 if 块(变量@err),那么该应用会呈现为网址 / orders / 9 。 但我需要转到上一个网址 - kosik / osobni-udaje

另外,我试图检查日志,但只有以下错误消息:

ActionView::MissingTemplate (Missing template orders/update, application/update with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee, :haml]}.

我做错了什么?

谢谢

4 个答案:

答案 0 :(得分:0)

尝试这样做:

  def update
    @order = Order.find(params[:id])
    fname = Order.check_attribute(params[:order][:first_name], 3, 40)
    lname = Order.check_attribute(params[:order][:last_name], 3, 40)

    if fname.nil? || lname.nil?
      @err = ''
      @err += 'Name is required<br />'
      @err += 'Surname is required<br />'
      render action: "/kosik/osobni-udaje"

    else
      if @order.update_attributes(params[:order])
        respond_to do |format|
          format.html { redirect_to cart_summary_path }
          format.json { head :no_content }
        end
      else
        respond_to do |format|
          format.html { render action: "/kosik/osobni-udaje" }
          format.json { render json: @order.errors, status: :unprocessable_entity }
        end
      end
    end

只需更改“respond_to”的位置       端

答案 1 :(得分:0)

好的,所以我这样解决了:

if fname.nil? || lname.nil?
  @err = ''
  @err += '...'
  @err += '...'

  flash[:error] = @err
  redirect_to :back
...

并且在视图中

- if flash[:error]
  %p #{flash[:error]}

这可能不是最好的解决方案,但它确实有效......

答案 2 :(得分:0)

你可以使用:

render 'home/cart_personal_data'

URI "/kosik/osobni-udaje"实际上并不是一个动作,即使有指向它的路径。 render需要控制器和操作或文件。有关详细信息,请参阅rails guide

希望这有帮助。

答案 3 :(得分:0)

我认为你的代码错了。

您应该在自定义验证程序中进行验证,例如指南中的示例:http://guides.rubyonrails.org/active_record_validations_callbacks.html#performing-custom-validations。之后,你可以这样做:

def update
  @order = Order.find(params[:id])
  if @order.update_attributes(params[:order])
    respond_to do |format|
      format.html { redirect_to cart_summary_path }
      format.json { head :no_content }
     end
   else
     respond_to do |format|
       format.html { render action: "/kosik/osobni-udaje" }
       format.json { render json: @order.errors, status: :unprocessable_entity }
     end
   end
end