为什么" format.json {render:show}"不行?

时间:2016-09-11 20:58:56

标签: ruby-on-rails json

我一直关注着使用Rails 4的敏捷Web开发一书。以下代码有点令人困惑:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
        <group android:checkableBehavior="single">
            <item android:id="@+id/nav_info_details" android:icon="@drawable/ic_menu_info_details"
                android:title="About us" />
            <item android:id="@+id/nav_rate" android:icon="@drawable/ic_menu_star"
                android:title="Rate App" />
            <item android:id="@+id/nav_share" android:icon="@drawable/ic_menu_share"
                android:title="Share App" />
            <item android:id="@+id/nav_facebook" android:icon="@drawable/ic_menu_fb"
                android:title="Follow me on Facebook" />
        </group>

        <item android:title="Communicate">
            <menu>
                 <item android:id="@+id/nav_whatsapp" android:icon="@drawable/ic_menu_whatsapp"
                    android:title="Whatsapp us to share your" />
                 <item android:id="@+id/nav_email" android:icon="@drawable/sym_action_email"
                    android:title="Tell us how you feel about App" />
             </menu>
        </item>
</menu>

我不确定这行是否

respond_to do |format|
  if @line_item.save
    format.html { redirect_to @line_item.cart, notice: 'Line item was successfully created.' }
    format.json { render :show, status: :created, location: @line_item }
  ...

确实有效,因为我无法通过Chrome中的检查工具找到任何JSON内容。

此外,&#34;渲染:显示&#34;似乎引用了jbuilder:

format.json { render :show, status: :created, location: @line_item }

我试图添加一些&#34; p ...&#34;在views/line_items/show.json.jbuilder ,但我没有在终端看到任何输出。

3 个答案:

答案 0 :(得分:3)

respond_to块中,只会运行其中一条format...行,具体取决于请求的类型。仅当初始请求是ajax请求时,format.json行才会运行。如果请求是普通表单提交,则仅使用format.html行。

答案 1 :(得分:0)

如果你想知道某些语法是否合法,你可以随便问自己:

while ($row = $result->fetch_assoc()) {
                    $returnedHTMl = "<tr>";
                    $returnedHTMl .= "<td>" . $row["interest"] . "</td>"
                    $returnedHTMl .= "<td><a href='http://localhost/page/files/".$row["filename"]."'>" . $row["filename"] . " </a></td>"
                    $returnedHTMl .= "<td>" . $row["reg_date"] . "</td>"; 

                    echo $returnedHTML
}

答案 2 :(得分:0)

非常合法。

在Ruby中,有多种方法可以将块(匿名函数)传递给方法。对于此示例,请使用Enumerable#map

我们可以使用do...end

['oof', 'rab'].map do |s| 
  s.reverse 
end
# => ["foo", "bar"]

或者我们可以使用内联块:

['oof', 'rab'].map { |s| s.reverse }
# => ["foo", "bar"]

我们也可以使用procs and lambdas,但不要在这里偏离。 Ruby解析器并不关心你使用上面的哪一个 - 但是有一些非常强大的社区约定:

  

首选{...}结束...单行块结束。避免使用{...}   对于多行块(多行链接总是很难看)。一直用   do ...结束“控制流程”和“方法定义”(例如,   Rakefiles和某些DSL)。链接时要避免...结束   https://github.com/bbatsov/ruby-style-guide

那么让我们看看我们是否可以让这个例子变得更加神秘:

respond_to do |format|
  if @line_item.save
    format.html do 
      redirect_to(@line_item.cart, notice: 'Line item was successfully created.')
    end
    format.json do
      render(:show, status: :created, location: @line_item)
      # or a more idiomatically correct API response
      # head( :created, location:  @line_item )
    end
  end
end